Автор Тема: Пробуем писать на O7  (Прочитано 25481 раз)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Пробуем писать на O7
« : Август 27, 2013, 05:04:25 pm »
В порядке разминки - давно правильны циклов не было :)
Итак, на входе массив массивов и разделитель. Надо все это объединить в одну последовательность. Т.е.: [[1, 2, 3], [4,5]], 10 -> [1, 2, 3, 10, 4, 5]
Экспериментировать можно прямо здесь: http://oberspace.dyndns.org/oberonjs.html

PROCEDURE do(input: ARRAY OF ARRAY OF INTEGER; separator: INTEGER);
...

P.S. Чувствую ЦД где-то рядом ;)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #1 : Август 27, 2013, 05:45:07 pm »
Мда, господа, пытаюсь сейчас решить эту задачку и прямо вижу -- не взлетит Оберон-07. Ни на десктопе, ни в вебе )))

Даёшь дженерики! Даёшь инициализацию массивов!! Даёшь динамические массивы!!! )))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #2 : Август 27, 2013, 05:49:05 pm »
Мда, господа, пытаюсь сейчас решить эту задачку и прямо вижу -- не взлетит Оберон-07. Ни на десктопе, ни в вебе )))

Даёшь дженерики! Даёшь инициализацию массивов!! Даёшь динамические массивы!!! )))

Хм, а ведь akron1 написал на этом языке редактор для оберона и компилятор. Прямо титанический труд ))
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #3 : Август 27, 2013, 06:07:53 pm »
Даёшь дженерики! Даёшь инициализацию массивов!! Даёшь динамические массивы!!! )))

Да, собственно я тоже стал представлять как это сделать... И решил запостить ;)

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #4 : Август 27, 2013, 06:18:35 pm »
Легко:
    static int[] doCS(int[][] input, int separator) {
      int len = input.Select(m => m.Length).Sum() + input.Length - 1;
      int[] res = new int[len];
      int i = 0;
      bool first = true;
      foreach (var m in input) {
        if (first) {
          first = false;
        } else {
          res[i++] = separator;
        }
        foreach (var x in m) {
          res[i++] = x;
        }
      }
      return res;
    }

Шутка :)

kkk

  • Гость
Re: Пробуем писать на O7
« Ответ #5 : Август 27, 2013, 08:22:45 pm »
Пусть тот код, который составил такой входной массив составит таким же способом массив для хранения результатов.  ;D

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #6 : Август 27, 2013, 08:24:46 pm »
Итак, на входе массив массивов и разделитель.
ARRAY OF ARRAY OF INTEGER это не массив массивов, а двумерный массив. В оберонах массив массивов это
ARRAY OF POINTER TO ARRAY OF INTEGER. Да, в репорте O7 нет указателей на массивы и динамических массивов, ну значит их следует добавить, на практике они нужны.

Даёшь дженерики! Даёшь инициализацию массивов!! Даёшь динамические массивы!!! )))
С динамическими массивами все понятно, а про дженерики много разговоров, но пока я не видел описание синтаксиса и семантики дженериков для оберона. Возможно, следует обсудить синтаксис и семантику дженериков (я в этом вопросе слабо разбираюсь).

kkk

  • Гость
Re: Пробуем писать на O7
« Ответ #7 : Август 27, 2013, 08:43:05 pm »
Если для общения с внешним миром Оберону будет достаточно открытых массивов, то внутри рантайма можно ведь обойтись и без динамических массивов.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #8 : Август 27, 2013, 08:44:13 pm »
ARRAY OF ARRAY OF INTEGER это не массив массивов, а двумерный массив.

Да, действительно, хотя размерности явно не указаны, но они будут одинаковы для всех элементов.

С динамическими массивами все понятно, а про дженерики много разговоров, но пока я не видел описание синтаксиса и семантики дженериков для оберона. Возможно, следует обсудить синтаксис и семантику дженериков (я в этом вопросе слабо разбираюсь).

Дженерики с собой сразу тащут много всего...

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #9 : Август 27, 2013, 09:23:00 pm »
А могут ли встречаться пустые массивы?

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #10 : Август 27, 2013, 09:30:28 pm »
А могут ли встречаться пустые массивы?

array of тип и есть пустой массив. То есть память не распределена.

Jordan

  • Sr. Member
  • ****
  • Сообщений: 282
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #11 : Август 27, 2013, 09:34:27 pm »
Пример на free pascal

{$mode objfpc}{$H+}
program main;

var
  M: array of integer;
begin
  WriteLn(Length(M));
end.

Ответ 0

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #12 : Август 27, 2013, 09:41:28 pm »
В порядке разминки - давно правильны циклов не было :)
Итак, на входе массив массивов и разделитель. Надо все это объединить в одну последовательность. Т.е.: [[1, 2, 3], [4,5]], 10 -> [1, 2, 3, 10, 4, 5]
Экспериментировать можно прямо здесь: http://oberspace.dyndns.org/oberonjs.html

PROCEDURE do(input: ARRAY OF ARRAY OF INTEGER; separator: INTEGER);
...

Итак, на входе массив массивов и разделитель.
ARRAY OF ARRAY OF INTEGER это не массив массивов, а двумерный массив. В оберонах массив массивов это
ARRAY OF POINTER TO ARRAY OF INTEGER. Да, в репорте O7 нет указателей на массивы и динамических массивов, ну значит их следует добавить, на практике они нужны.

Вы оба не правы :-)

Массив по определению - это (упорядоченное)множество элементов одного типа. Соответственно массив массивов - это массив массивов ОДНОГО типа, а ARRAY 24 OF INTEGER и ARRAY 42 OF INTEGER - это два разных типа. Следовательно массив массивов всегда эквивалентен прямому произведению оных массивов. Ну, в частном случае это будет просто двумерный массив.

Но, с другой стороны, то что написал в примере Влад ([[1, 2, 3], [4,5]]) не является массивом массивов (длины массивов разные). То есть таки да, ARRAY OF ARRAY OF INTEGER не годится.

Указатель на массив для получения того что требуется, также не нужно вводить в язык. Все делается ведь элементарно:
...

Как именно делается элементарно пока не покажу - в компиляторе обнаружился баг :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #13 : Август 27, 2013, 10:34:18 pm »
А могут ли встречаться пустые массивы?

Репорт традиционно молчит. В моей реализации - нет, будет ошибка компиляции при попытке объявить нулевой массив.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #14 : Август 28, 2013, 04:40:35 am »
А зачем? Никто ведь не мешает обойти массив в том порядке, который нужен.
Потому что иначе, по причине отсутствия динамических массивов, простой реализации не получится, придётся городить что-то подобное:
TYPE
  Chunk = POINTER TO ChunkDesc;
  ChunkDesc = RECORD next : Chunk; END;
  Chunk1024 = POINTER TO Chunk1024Desc;
  Chunk1024Desc = RECORD( ChunkDesc ) value: ARRAY 1024 OF INTEGER; END;
  Chunk512 = POINTER TO Chunk512Desc;
  Chunk512Desc = RECORD( ChunkDesc ) value: ARRAY 512 OF INTEGER; END;
  ...
  ChunkXXX = POINTER TO ChunkXXXDesc;
  ChunkXXXDesc = RECORD( ChunkDesk ) value : ARRAY XXX OF INTEGER; END;

  LIST = Chunk;
Или вообще, каждый элемент оборачивать. Но в любом случае, чтобы получить динамику, придётся городить списковые структуры или даже деревья.