Oberon space

General Category => Общий раздел => Тема начата: vlad от Август 27, 2013, 05:04:25 pm

Название: Пробуем писать на O7
Отправлено: vlad от Август 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. Чувствую ЦД где-то рядом ;)
Название: Re: Пробуем писать на O7
Отправлено: Geniepro от Август 27, 2013, 05:45:07 pm
Мда, господа, пытаюсь сейчас решить эту задачку и прямо вижу -- не взлетит Оберон-07. Ни на десктопе, ни в вебе )))

Даёшь дженерики! Даёшь инициализацию массивов!! Даёшь динамические массивы!!! )))
Название: Re: Пробуем писать на O7
Отправлено: Geniepro от Август 27, 2013, 05:49:05 pm
Мда, господа, пытаюсь сейчас решить эту задачку и прямо вижу -- не взлетит Оберон-07. Ни на десктопе, ни в вебе )))

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

Хм, а ведь akron1 написал на этом языке редактор для оберона и компилятор. Прямо титанический труд ))
Название: Re: Пробуем писать на O7
Отправлено: vlad от Август 27, 2013, 06:07:53 pm
Даёшь дженерики! Даёшь инициализацию массивов!! Даёшь динамические массивы!!! )))

Да, собственно я тоже стал представлять как это сделать... И решил запостить ;)
Название: Re: Пробуем писать на O7
Отправлено: Peter Almazov от Август 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;
    }

Шутка :)
Название: Re: Пробуем писать на O7
Отправлено: kkk от Август 27, 2013, 08:22:45 pm
Пусть тот код, который составил такой входной массив составит таким же способом массив для хранения результатов.  ;D
Название: Re: Пробуем писать на O7
Отправлено: akron1 от Август 27, 2013, 08:24:46 pm
Итак, на входе массив массивов и разделитель.
ARRAY OF ARRAY OF INTEGER это не массив массивов, а двумерный массив. В оберонах массив массивов это
ARRAY OF POINTER TO ARRAY OF INTEGER. Да, в репорте O7 нет указателей на массивы и динамических массивов, ну значит их следует добавить, на практике они нужны.

Даёшь дженерики! Даёшь инициализацию массивов!! Даёшь динамические массивы!!! )))
С динамическими массивами все понятно, а про дженерики много разговоров, но пока я не видел описание синтаксиса и семантики дженериков для оберона. Возможно, следует обсудить синтаксис и семантику дженериков (я в этом вопросе слабо разбираюсь).
Название: Re: Пробуем писать на O7
Отправлено: kkk от Август 27, 2013, 08:43:05 pm
Если для общения с внешним миром Оберону будет достаточно открытых массивов, то внутри рантайма можно ведь обойтись и без динамических массивов.
Название: Re: Пробуем писать на O7
Отправлено: vlad от Август 27, 2013, 08:44:13 pm
ARRAY OF ARRAY OF INTEGER это не массив массивов, а двумерный массив.

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

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

Дженерики с собой сразу тащут много всего...
Название: Re: Пробуем писать на O7
Отправлено: Valery Solovey от Август 27, 2013, 09:23:00 pm
А могут ли встречаться пустые массивы?
Название: Re: Пробуем писать на O7
Отправлено: Jordan от Август 27, 2013, 09:30:28 pm
А могут ли встречаться пустые массивы?

array of тип и есть пустой массив. То есть память не распределена.
Название: Re: Пробуем писать на O7
Отправлено: Jordan от Август 27, 2013, 09:34:27 pm
Пример на free pascal

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

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

Ответ 0
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Август 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 не годится.

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

Как именно делается элементарно пока не покажу - в компиляторе обнаружился баг :-)
Название: Re: Пробуем писать на O7
Отправлено: vlad от Август 27, 2013, 10:34:18 pm
А могут ли встречаться пустые массивы?

Репорт традиционно молчит. В моей реализации - нет, будет ошибка компиляции при попытке объявить нулевой массив.
Название: Re: Пробуем писать на O7
Отправлено: Kemet от Август 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;
Или вообще, каждый элемент оборачивать. Но в любом случае, чтобы получить динамику, придётся городить списковые структуры или даже деревья.
Название: Re: Пробуем писать на O7
Отправлено: Geniepro от Август 28, 2013, 06:56:50 am
Легко:
...
Шутка :)

Ну раз пошёл такой оффтоп, то и я не удержусь:  :P
concat'intersperse :: a -> [[a]] -> [a]
concat'intersperse _   []       = []
concat'intersperse sep (xs:[])  = xs
concat'intersperse sep (xs:xss) = xs ++ sep:concat'intersperse sep xss

main = do
    print $ concat'intersperse 10 []
    print $ concat'intersperse 10 [[]]
    print $ concat'intersperse 10 [[1,2,3]]
    print $ concat'intersperse 10 [[1,2,3], [4,5]]
    print $ concat'intersperse 10 [[1,2,3], [4,5], [6]]
Main> :main
[]
[]
[1,2,3]
[1,2,3,10,4,5]
[1,2,3,10,4,5,10,6]
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Август 28, 2013, 07:39:49 am
Легко:
...
Шутка :)

Ну раз пошёл такой оффтоп, то и я не удержусь:  :P
concat'intersperse :: a -> [[a]] -> [a]
concat'intersperse _   []       = []
concat'intersperse sep (xs:[])  = xs
concat'intersperse sep (xs:xss) = xs ++ sep:concat'intersperse sep xss

main = do
    print $ concat'intersperse 10 []
    print $ concat'intersperse 10 [[]]
    print $ concat'intersperse 10 [[1,2,3]]
    print $ concat'intersperse 10 [[1,2,3], [4,5]]
    print $ concat'intersperse 10 [[1,2,3], [4,5], [6]]
Main> :main
[]
[]
[1,2,3]
[1,2,3,10,4,5]
[1,2,3,10,4,5,10,6]

Э, нет. На списках каждый дурак даже на обероне-07 может. А ты на массивах, на массивах давай! То есть  ArrayList (а не список!) массивов причем все массивы разной длины.
Название: Re: Пробуем писать на O7
Отправлено: igor от Август 28, 2013, 07:42:25 am
array of тип и есть пустой массив. То есть память не распределена.
Точнее, память распределена только под указатель (изначально NIL).
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Август 28, 2013, 07:47:54 am
Ну раз пошёл такой оффтоп, то и я не удержусь:  :P
concat'intersperse :: a -> [[a]] -> [a]
concat'intersperse _   []       = []
concat'intersperse sep (xs:[])  = xs
concat'intersperse sep (xs:xss) = xs ++ sep:concat'intersperse sep xss

main = do
    print $ concat'intersperse 10 []
    print $ concat'intersperse 10 [[]]
    print $ concat'intersperse 10 [[1,2,3]]
    print $ concat'intersperse 10 [[1,2,3], [4,5]]
    print $ concat'intersperse 10 [[1,2,3], [4,5], [6]]
Main> :main
[]
[]
[1,2,3]
[1,2,3,10,4,5]
[1,2,3,10,4,5,10,6]

Э, нет. На списках каждый дурак даже на обероне-07 может. А ты на массивах, на массивах давай! То есть  ArrayList (а не список!) массивов причем все массивы разной длины.

Да, и без левых расширизмов, вроде тех же существовательных типов, пожалуйста. Ведь мы тут пишем на чистом Обероне-07, без расширизмов, вот и ты давай на чистом Haskell'e, без ghc-расширизмов :-)
Название: Re: Пробуем писать на O7
Отправлено: Geniepro от Август 28, 2013, 08:03:37 am
Э, нет. На списках каждый дурак даже на обероне-07 может. А ты на массивах, на массивах давай! То есть  ArrayList (а не список!) массивов причем все массивы разной длины.

Я даже не помню как работать с массивами на хаскелле -- это же неидеоматично для него )))
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Август 28, 2013, 08:29:50 am
Э, нет. На списках каждый дурак даже на обероне-07 может. А ты на массивах, на массивах давай! То есть  ArrayList (а не список!) массивов причем все массивы разной длины.

Я даже не помню как работать с массивами на хаскелле -- это же неидеоматично для него )))
Ну вот, для Оберона-07 тоже не идиоматично использовать массив как контейнер общего назначения :-) В Обероне-07 массив - это строительный блок для структур данных (контейнеров), ну и для всякой мелочи, вроде локальных буферов.
Название: Re: Пробуем писать на O7
Отправлено: Geniepro от Август 28, 2013, 09:44:08 am
Ну раз пошёл такой оффтоп, то и я не удержусь:  :P
concat'intersperse :: a -> [[a]] -> [a]
concat'intersperse _   []       = []
concat'intersperse sep (xs:[])  = xs
concat'intersperse sep (xs:xss) = xs ++ sep:concat'intersperse sep xss

Чо ж я так перемудрил-то? Ведь в самом придуманном мною имени функции подсказка к её реализации:
import List

concat'intersperse :: a -> [[a]] -> [a]
concat'intersperse sep xss = concat $ intersperse [sep] xss

main = do
    print $ concat'intersperse 10 []
    print $ concat'intersperse 10 [[]]
    print $ concat'intersperse 10 [[1,2,3]]
    print $ concat'intersperse 10 [[1,2,3], [4,5]]
    print $ concat'intersperse 10 [[1,2,3], [4,5], [6]]
    print $ concat'intersperse ' ' ["qwerty", "asdf", "zxc"]
Main> :main
[]
[]
[1,2,3]
[1,2,3,10,4,5]
[1,2,3,10,4,5,10,6]
"qwerty asdf zxc"
Название: Re: Пробуем писать на O7
Отправлено: Geniepro от Август 28, 2013, 09:49:36 am
Ну вот, для Оберона-07 тоже не идиоматично использовать массив как контейнер общего назначения :-) В Обероне-07 массив - это строительный блок для структур данных (контейнеров), ну и для всякой мелочи, вроде локальных буферов.

Так в самом языке Хаскелл нет даже такого понятия как массив. Это всего лишь одна из стандартных библиотек. Чтобы создать масcив массивов с содержимым [[1,2,3], [4,5], [6]] надо такой код громоздить:
arr = array (0, 2)  [ (0, array (0, 2) [(0, 1), (1, 2), (2, 3)])
                    , (1, array (0, 1) [(0, 4), (1, 5)])
                    , (2, array (0, 0) [(0, 6)])
                    ]
Название: Re: Пробуем писать на O7
Отправлено: ilovb от Август 28, 2013, 11:27:37 am
Товарищи, подскажите. В седьмом объероне можно так?

PROCEDURE Do(p: INTEGER);
VAR
r:  POINTER TO RECORD
        a: ARRAY p OF INTEGER;
    END;
BEGIN
END Do;

В репорте вроде так...
Цитировать
...
length = ConstExpression.
ConstExpression = expression...
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Август 28, 2013, 11:40:02 am
Товарищи, подскажите. В седьмом объероне можно так?

PROCEDURE Do(p: INTEGER);
VAR
r:  POINTER TO RECORD
        a: ARRAY p OF INTEGER;
    END;
BEGIN
END Do;

В репорте вроде так...
Цитировать
...
length = ConstExpression.
ConstExpression = expression...
p ведь не константа. Нельзя так. И в C++ так нельзя. А вот в C99 - можно.
Название: Re: Пробуем писать на O7
Отправлено: ilovb от Август 28, 2013, 11:44:41 am
Так там expression без ограничений.
Где в репорте ты видишь такой запрет?

У меня сейчас разрыв шаблона...  :)
Я всегда думал что в седьмом обероне динамика именно так и делается...
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Август 28, 2013, 12:05:38 pm
Так там expression без ограничений.
Где в репорте ты видишь такой запрет?

У меня сейчас разрыв шаблона...  :)
Я всегда думал что в седьмом обероне динамика именно так и делается...
Какой смысл вводить ConstExpression если он просто эквивалентен expression? :-) (ConstExpression = expression. )

В репорте есть некая неопределенность что именно считать const expression'ом, однако в том месте в котором у тебя заминка, разночтений быть не может:
Цитировать
A constant expression can be evaluated by a mere textual scan without actually executing the
program.
Твой пример не позволяет на этапе компиляции (без исполнения программы) вычислить 'p', а следовательно и длину массива.
Название: Re: Пробуем писать на O7
Отправлено: Valery Solovey от Август 28, 2013, 12:06:39 pm
PROCEDURE Planarize(a: Arrs; delimeter: INTEGER): Arr;
VAR  b, tmp: Arr;
i, j, k, len: INTEGER;
BEGIN
i := 0; len := 0;
WHILE i < LEN(a) DO
len := len + LEN(a[i]);
i := i + 1
END;

NEW( b, len * 2 - 1 );
i := 0;
k := 0;
WHILE i < LEN( a ) DO
tmp := a[i];
j := 0;
WHILE j < LEN( tmp ) DO
b[k] := tmp[j];
j := j + 1;
k := k + 2
END;
i := i + 1
END;

i := 1;
WHILE i < LEN( b ) DO
b[i] := delimeter;
i := i + 2
END;

RETURN b
END Planarize;
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Август 28, 2013, 12:14:25 pm
PROCEDURE Planarize(a: Arrs; delimeter: INTEGER): Arr;
VAR  b, tmp: Arr;
i, j, k, len: INTEGER;
BEGIN
i := 0; len := 0;
WHILE i < LEN(a) DO
len := len + LEN(a[i]);
i := i + 1
END;

NEW( b, len * 2 - 1 );
i := 0;
k := 0;
WHILE i < LEN( a ) DO
tmp := a[i];
j := 0;
WHILE j < LEN( tmp ) DO
b[k] := tmp[j];
j := j + 1;
k := k + 2
END;
i := i + 1
END;

i := 1;
WHILE i < LEN( b ) DO
b[i] := delimeter;
i := i + 2
END;

RETURN b
END Planarize;
А что такое Arr и Arrs? Собственно в Обероне-07 вся фишка в работе с типами. Алгоритмы то тривиальны.
Название: Re: Пробуем писать на O7
Отправлено: Geniepro от Август 28, 2013, 12:19:58 pm
PROCEDURE Planarize(a: Arrs; delimeter: INTEGER): Arr;
VAR  b, tmp: Arr;
i, j, k, len: INTEGER;
BEGIN
i := 0; len := 0;
WHILE i < LEN(a) DO
len := len + LEN(a[i]);
i := i + 1
END;

NEW( b, len * 2 - 1 );
i := 0;
k := 0;
WHILE i < LEN( a ) DO
tmp := a[i];
j := 0;
WHILE j < LEN( tmp ) DO
b[k] := tmp[j];
j := j + 1;
k := k + 2
END;
i := i + 1
END;

i := 1;
WHILE i < LEN( b ) DO
b[i] := delimeter;
i := i + 2
END;

RETURN b
END Planarize;

А Вы проверяли этот код? Можете привести описания типов Arr и Arrs?
А то что я ни пытаюсь изобразить, ни онлайн-компилятор OberonJS, ни компилятор от akron1'а не хотят принимать их...
Название: Re: Пробуем писать на O7
Отправлено: ilovb от Август 28, 2013, 12:22:35 pm
В репорте есть некая неопределенность что именно считать const expression'ом, однако в том месте в котором у тебя заминка, разночтений быть не может:
Цитировать
A constant expression can be evaluated by a mere textual scan without actually executing the
program.
Твой пример не позволяет на этапе компиляции (без исполнения программы) вычислить 'p', а следовательно и длину массива.

Я думал это относится только к Constant declarations.
Название: Re: Пробуем писать на O7
Отправлено: Geniepro от Август 28, 2013, 12:23:11 pm
А что такое Arr и Arrs? Собственно в Обероне-07 вся фишка в работе с типами. Алгоритмы то тривиальны.
Arr не может быть массивом, так как процедура в Обероне-07 не может вернуть массив в качестве значения. С другой стороны, указателем на массив Arr тоже быть не может? По мнению компилятора akron1'а, по крайней мере...
Название: Re: Пробуем писать на O7
Отправлено: Valery Solovey от Август 28, 2013, 12:57:07 pm
считайте, что это Оберон 89 : ).
А для 07 нужен особый модуль. Для вывода данных. Например, Channels. В нём с помощью низкоуровневых средств может создаваться выходной канал (массив произвольной длины, например).
Название: Re: Пробуем писать на O7
Отправлено: Valery Solovey от Август 28, 2013, 12:58:15 pm
А что такое Arr и Arrs? Собственно в Обероне-07 вся фишка в работе с типами. Алгоритмы то тривиальны.
Arr не может быть массивом, так как процедура в Обероне-07 не может вернуть массив в качестве значения. С другой стороны, указателем на массив Arr тоже быть не может? По мнению компилятора akron1'а, по крайней мере...
Arrs = POINTER TO ARRAY OF POINTER TO ARRAY OF INTEGER;
Arr = POINTER TO ARRAY OF INTEGER;
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Август 28, 2013, 01:16:55 pm
А что такое Arr и Arrs? Собственно в Обероне-07 вся фишка в работе с типами. Алгоритмы то тривиальны.
Arr не может быть массивом, так как процедура в Обероне-07 не может вернуть массив в качестве значения. С другой стороны, указателем на массив Arr тоже быть не может? По мнению компилятора akron1'а, по крайней мере...
Arrs = POINTER TO ARRAY OF POINTER TO ARRAY OF INTEGER;
Arr = POINTER TO ARRAY OF INTEGER;

POINTER TO ARRAY OF POINTER TO ARRAY OF INTEGER; - не бывает
Arr = POINTER TO ARRAY OF INTEGER; - тоже не бывает.
Название: Re: Пробуем писать на O7
Отправлено: Geniepro от Август 28, 2013, 01:29:08 pm
POINTER TO ARRAY OF POINTER TO ARRAY OF INTEGER; - не бывает
Arr = POINTER TO ARRAY OF INTEGER; - тоже не бывает.

Вообще, какие полезные массивные типы там могут быть-то хоть?
Название: Re: Пробуем писать на O7
Отправлено: ilovb от Август 28, 2013, 03:32:53 pm
Слушайте, народ, че то я не врубаюсь. А как без динамических массивов кодить то? O_o

Вот например хочу прочитать из файла массив строк. Естественно что ни длина массива ни длины строк заранее неизвестны. Как их в памяти то разместить?
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Август 28, 2013, 03:51:57 pm
Слушайте, народ, че то я не врубаюсь. А как без динамических массивов кодить то? O_o

Вот например хочу прочитать из файла массив строк. Естественно что ни длина массива ни длины строк заранее неизвестны. Как их в памяти то разместить?
Через любую динамическую структуру данных. Например список чанков, или vlist какой-нибудь.
Название: Re: Пробуем писать на O7
Отправлено: ilovb от Август 28, 2013, 03:56:10 pm
Т.е. окромя списка никак? Жесть однако.
Название: Re: Пробуем писать на O7
Отправлено: ilovb от Август 28, 2013, 05:07:38 pm
function concat(input, separator)
    local result = {}
    function foo(input, result)
        for _, v in ipairs(input) do
            if type(v) == 'table' then
                foo(v, result)
            else
                result[#result+1] = v
            end
        end
    end
    foo(input, result)
    return table.concat(result, separator)
end

local arr = {{{1, 2, 3}, {4,5}}, 10}

print(concat(arr, ', '))
Название: Re: Пробуем писать на O7
Отправлено: ilovb от Август 28, 2013, 05:12:03 pm
Тьху блин. Так там разделитель 10?
Походу я не понял задачу...
Название: Re: Пробуем писать на O7
Отправлено: Jordan от Август 30, 2013, 05:57:39 pm
Слушайте, народ, че то я не врубаюсь. А как без динамических массивов кодить то? O_o

Вот например хочу прочитать из файла массив строк. Естественно что ни длина массива ни длины строк заранее неизвестны. Как их в памяти то разместить?
Через любую динамическую структуру данных. Например список чанков, или vlist какой-нибудь.

Вот он минимализм. В процессорах начиная с pentium появилась технология предвыборка данных.

http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_%D0%BA%D0%BE%D0%B4%D0%B0

Цитировать
Предвыборка кода — это запрос процессора в оперативную память для считывания инструкций заблаговременно, до того момента как эти инструкции потребуется исполнять. В результате этого запроса, инструкции загружаются из памяти в кэш. Когда инструкции, потребуется исполнять, доступ к ним будет осуществляться значительно быстрее, т.к. задержка при обращении в кэш на порядки меньше, чем при обращении в оперативную паять.

Получается данный пласт оптимизации, не будет задействован. То есть только на статике.

Т.е. окромя списка никак? Жесть однако.

Уверен, что да, жесть. Бывает для задачи проще массив, чем список, потом следить за указателями и т.д

А ещё проще делать массив указателей.
Название: Re: Пробуем писать на O7
Отправлено: Jordan от Август 30, 2013, 06:04:22 pm
Стоп. А как динамические строки использовать?

CONST
  MAX_STRING = 255;


VAR
String: ARRAY MAX_STRING OF CHAR;

Или делать строки на списках. Объединение будет быстрым. А вот проход будет постоянным, кэш промахом.
Название: Re: Пробуем писать на O7
Отправлено: Jordan от Август 30, 2013, 06:07:14 pm
Слишком низкоуровневым язык получился. ИМХО.
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Август 30, 2013, 06:16:09 pm
Слишком низкоуровневым язык получился. ИМХО.
Ну, скажем так - без стандартной либы и дополнительного инструментария для разработки, этот язык слабо пригоден для прикладного программиста.
Название: Re: Пробуем писать на O7
Отправлено: Valery Solovey от Август 30, 2013, 10:58:19 pm
Вот он минимализм. В процессорах начиная с pentium появилась технология предвыборка данных.

http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D0%B4%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_%D0%BA%D0%BE%D0%B4%D0%B0
Во-первых, это предвыборка кода, а во-вторых, на Яве есть сторонняя библиотека (называется как-то типа Ropes), производительность которой выше, чем над стандартными строками именно потому, что внутреннее представление строк там в виде дерева (вроде) из подстрок (возможно, даже, массивов).
Название: Re: Пробуем писать на O7
Отправлено: Kemet от Август 31, 2013, 12:34:51 pm
Слишком низкоуровневым язык получился. ИМХО.
Смотря где его применять. Для ПЛИС, например, вполне нормально.
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Сентябрь 06, 2013, 05:18:23 pm
Такс. Набросал пример решения (не претендуя на алгоритмическую гениальность и кошерность циклов) с применением прототипа макета черновика стандартной либы :-)

(поскольку это прототип, погонять в онлайн-компиляторе пока не выйдет)

Да, для полноты картины я реализовал обе фунции - и ту которая создает входные данные и ту которая уже слепливает "массивы" в один с разделителями.

MODULE VladQuest;

  IMPORT VectorInt, ArrayInt;

  PROCEDURE Merge(input: ARRAY OF VectorInt.T; separator: INTEGER) : VectorInt.T;
  VAR
    res : VectorInt.T;
    i,j : INTEGER;
  BEGIN
    res := VectorInt.Create;
    FOR i:=0 TO LEN(input) DO
      FOR j:=0 TO VectorInt.Len(input[i]) DO
        VectorInt.PushBack(res,VectorInt.Get(input[i],j))
      END;
      VectorInt.PushBack(res, separator)
    END
    VectorInt.PopBack(res);
    RETURN res
  END Merge;

  PROCEDURE Test;
  VAR
    input : ARRAY 2 OF ArrayInt.T;
  BEGIN
    ArrayInt.Fill2(input,
                   VectorInt.Make3(1,2,3),
                   VectorInt.Make2(4,5));
    Merge(input, 10);
  END Test; 

END VladQuest.

Возможен вопрос - а что если мне не нравятся такие длиные имена у функций (VectorInt.PusgBack), что если хочется короче и лаконичней? Не проблема, можно сделать псевдонимы (хотя возможность именно такого рода псевдонимов, удобный таких, прямо сейчас горячо обсуждается в конфе :-) ):
MODULE VladQuest;

  IMPORT VectorInt, ArrayInt;

  CONST
    Create   = VectorInt.Create;
    Len      = VectorInt.Len;
    PushBack = VectorInt.PushBack;
    PopBack  = VectorInt.PopBack;
    Get      = VectorInt.Get;
    Make3    = VectorInt.Make3;
    Make2    = VectorInt.Make2;

    Fill2 = ArrayInt.Fill2;

  PROCEDURE Merge(input: ARRAY OF VectorInt.T; separator: INTEGER) : VectorInt.T;
  VAR
    res : VectorInt.T;
    i,j : INTEGER;
  BEGIN
    res := Create;
    FOR i:=0 TO LEN(input) DO
      FOR j:=0 TO Len(input[i]) DO
        PushBack(res,Get(input[i],j))
      END;
      PushBack(res, separator)
    END
    PopBack(res);
    RETURN res
  END Merge;

  PROCEDURE Test;
  VAR
    input : ARRAY 2 OF ArrayInt.T;
  BEGIN
    ArrayInt.Fill2(input,
                   Make3(1,2,3),
                   Make2(4,5));
    Merge(input, 10);
  END Test; 

END VladQuest.
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Сентябрь 06, 2013, 05:30:37 pm
Так. Налажал таки. IMPORT ArrayInt следует заменить на IMPORT ArrayVectorInt;

Ну и соответственно ArrayInt.Fill2 на ArrayVectorInt.Fill2
Название: Re: Пробуем писать на O7
Отправлено: vlad от Сентябрь 06, 2013, 06:11:42 pm
Для контраста питоновский вариант:
a = [[1, 2, 3], [4,5]]
sep = 10
reduce(lambda x, y: x + [sep] + y, a)

Выводит:
Цитировать
[1, 2, 3, 10, 4, 5]
Название: Re: Пробуем писать на O7
Отправлено: akron1 от Сентябрь 07, 2013, 06:41:39 pm
  CONST
    Create   = VectorInt.Create;
    Len      = VectorInt.Len;
    PushBack = VectorInt.PushBack;
    PopBack  = VectorInt.PopBack;
    Get      = VectorInt.Get;
    Make3    = VectorInt.Make3;
    Make2    = VectorInt.Make2;

Мне не кажется это хорошим решением. Псевдонимы нужны не только для процедур, но и для переменных и типов. Объявление CONST будет выглядеть странно (даже если формально (!) это не противоречит репорту). Если уж расширять язык, то лучше, наверное, разделить объявление собственно констант и псевдонимов. Может быть так:

MODULE Foo;
IMPORT Out;

ALIAS
  outs = Out.String;
...

CONST
...
TYPE
...
VAR
...
BEGIN
...
END Foo.
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Сентябрь 07, 2013, 06:53:41 pm
  CONST
    Create   = VectorInt.Create;
    Len      = VectorInt.Len;
    PushBack = VectorInt.PushBack;
    PopBack  = VectorInt.PopBack;
    Get      = VectorInt.Get;
    Make3    = VectorInt.Make3;
    Make2    = VectorInt.Make2;

Мне не кажется это хорошим решением. Псевдонимы нужны не только для процедур, но и для переменных и типов. Объявление CONST будет выглядеть странно (даже если формально (!) это не противоречит репорту). Если уж расширять язык, то лучше, наверное, разделить объявление собственно констант и псевдонимов. Может быть так:

MODULE Foo;
IMPORT Out;

ALIAS
  outs = Out.String;
...

CONST
...
TYPE
...
VAR
...
BEGIN
...
END Foo.
Штука в том, что я не собираюсь расширять язык. Зачем его расширять, если там все есть и так? :-)

Вообще, с константами в Обероне большая беда. Там это весьма мутное понятие. И это предмет отдельного разговора, чтобы договориться и уточнить что под этим подразумевается.
Название: Re: Пробуем писать на O7
Отправлено: DddIzer от Сентябрь 07, 2013, 06:55:53 pm
зачем? чем это лучше, c точки зрения наглядности:
IMPORT
OutS:=Out.String,
...
Название: Re: Пробуем писать на O7
Отправлено: DddIzer от Сентябрь 07, 2013, 06:57:16 pm
Вообще, с константами в Обероне большая беда. Там это весьма мутное понятие. И это предмет отдельного разговора, чтобы договориться и уточнить что под этим подразумевается.
то что вы предлагаете ясности не привносит, по - любому.
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Сентябрь 07, 2013, 07:18:23 pm
зачем? чем это лучше, c точки зрения наглядности:
IMPORT
OutS:=Out.String,
...
Это ж не валидная конструкция в Обероне.
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Сентябрь 07, 2013, 07:21:02 pm
Вообще, с константами в Обероне большая беда. Там это весьма мутное понятие. И это предмет отдельного разговора, чтобы договориться и уточнить что под этим подразумевается.
то что вы предлагаете ясности не привносит, по - любому.
Я предлагаю лишь обсудить, и показываю варианты толкования.
Название: Re: Пробуем писать на O7
Отправлено: DddIzer от Сентябрь 07, 2013, 07:55:52 pm
зачем? чем это лучше, c точки зрения наглядности:
IMPORT
OutS:=Out.String,
...
Это ж не валидная конструкция в Обероне.
почему, просто это работает только для модулей (вообще говоря, я комментировал предложение Акрона по поводу добавления секции ALIAS  - c точки зрения репорта она один черт невалидна - просто вы успели вставить сообщение раньше).
Название: Re: Пробуем писать на O7
Отправлено: DddIzer от Сентябрь 07, 2013, 07:59:36 pm
т.е.  просто расширение предполагает возможность создания псевдонима на любую импортируемую сущность (а не только модули)
Название: Re: Пробуем писать на O7
Отправлено: Kemet от Сентябрь 08, 2013, 04:05:17 am
Как уже предлагал в конференции, сделать по типу Модулы-3:
FROM ModuleName IMPORT X, Y, Z, P := Proc, P1 := Proc1;
Название: Re: Пробуем писать на O7
Отправлено: Kemet от Сентябрь 08, 2013, 04:10:15 am
Но вообще, лично я предпочитаю видеть квалификатор модуля в имени переменной/процедуры, потому что сразу понятно, что это и зачем.
Название: Re: Пробуем писать на O7
Отправлено: DddIzer от Сентябрь 08, 2013, 07:21:25 am
Как уже предлагал в конференции, сделать по типу Модулы-3:
FROM ModuleName IMPORT X, Y, Z, P := Proc, P1 := Proc1;
неплохо , но требует расширения синтаксиса, как и в случае с алиасом.
Название: Re: Пробуем писать на O7
Отправлено: Илья Ермаков от Сентябрь 08, 2013, 09:38:05 am
    res := VectorInt.Create;

Так, а разве в Обероне при вызове функции скобки не являются обязательными? В КП без скобок можно вызывать только процедуры.
Название: Re: Пробуем писать на O7
Отправлено: Geniepro от Сентябрь 08, 2013, 11:15:22 am
Как уже предлагал в конференции, сделать по типу Модулы-3:
FROM ModuleName IMPORT X, Y, Z, P := Proc, P1 := Proc1;
неплохо , но требует расширения синтаксиса, как и в случае с алиасом.

Так это ещё в Модуле-2 было, Вирт от этого отказался в обероне в пользу явной квалификации без исключений...
Название: Re: Пробуем писать на O7
Отправлено: Geniepro от Сентябрь 08, 2013, 11:16:30 am
    res := VectorInt.Create;

Так, а разве в Обероне при вызове функции скобки не являются обязательными? В КП без скобок можно вызывать только процедуры.

Это называется непротестированный код )))
Название: Re: Пробуем писать на O7
Отправлено: Kemet от Сентябрь 08, 2013, 11:32:15 am
Как уже предлагал в конференции, сделать по типу Модулы-3:
FROM ModuleName IMPORT X, Y, Z, P := Proc, P1 := Proc1;
неплохо , но требует расширения синтаксиса, как и в случае с алиасом.
Это не важно, главное, что ни один из предложенных вариантов не будет компилироваться ни одним компилятором любого из Оберонов.
И если уж мы решили расширить язык, то в данном случае лучше расширить синтаксически, чем семантически. Потому что перегруженная семантика совершенно не очевидна.
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Сентябрь 08, 2013, 11:57:02 am
    res := VectorInt.Create;

Так, а разве в Обероне при вызове функции скобки не являются обязательными? В КП без скобок можно вызывать только процедуры.

Являются. Иначе была бы при подобном вызове функции которая возвращает процедурный тип. Так что это мой ляп.

Плюс у меня там еще один ляп:
Merge(input, 10);
Вызов функции без созранения возвращенного значения.
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Сентябрь 08, 2013, 12:04:45 pm
Как уже предлагал в конференции, сделать по типу Модулы-3:
FROM ModuleName IMPORT X, Y, Z, P := Proc, P1 := Proc1;
неплохо , но требует расширения синтаксиса, как и в случае с алиасом.
Это не важно, главное, что ни один из предложенных вариантов не будет компилироваться ни одним компилятором любого из Оберонов.
Возможно лишь потому, что они не до конца и не правильно интерпретируют Oberon-report? :-)

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

Цитировать
И если уж мы решили расширить язык, то в данном случае лучше расширить синтаксически, чем семантически. Потому что перегруженная семантика совершенно не очевидна.
Нет, не решили. Речь идет о уточнении семантики актуального оберон-репорта. Без оглядки на то, какие традиции сложились вокруг реализаций других оберонов.
Название: Re: Пробуем писать на O7
Отправлено: valexey_u от Сентябрь 08, 2013, 12:07:27 pm
Вообще, народ, я этот пример приводил не за ради этих несчастных CONST'ов (они второстепенны), а чтобы показать как примерно будет писаться код с использованием стандартной либы. То есть показать примерно как я себе вижу оную стандартную библиотеку в разрезе контейнеров.

Я правильно понимаю, что возражений, замечаний и вопросов нет?