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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #15 : Август 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]
to iterate is human, to recurse, divine

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #16 : Август 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 (а не список!) массивов причем все массивы разной длины.
Y = λf.(λx.f (x x)) (λx.f (x x))

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #17 : Август 28, 2013, 07:42:25 am »
array of тип и есть пустой массив. То есть память не распределена.
Точнее, память распределена только под указатель (изначально NIL).

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #18 : Август 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-расширизмов :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #19 : Август 28, 2013, 08:03:37 am »
Э, нет. На списках каждый дурак даже на обероне-07 может. А ты на массивах, на массивах давай! То есть  ArrayList (а не список!) массивов причем все массивы разной длины.

Я даже не помню как работать с массивами на хаскелле -- это же неидеоматично для него )))
to iterate is human, to recurse, divine

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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #20 : Август 28, 2013, 08:29:50 am »
Э, нет. На списках каждый дурак даже на обероне-07 может. А ты на массивах, на массивах давай! То есть  ArrayList (а не список!) массивов причем все массивы разной длины.

Я даже не помню как работать с массивами на хаскелле -- это же неидеоматично для него )))
Ну вот, для Оберона-07 тоже не идиоматично использовать массив как контейнер общего назначения :-) В Обероне-07 массив - это строительный блок для структур данных (контейнеров), ну и для всякой мелочи, вроде локальных буферов.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #21 : Август 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"
to iterate is human, to recurse, divine

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #22 : Август 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)])
                    ]
« Последнее редактирование: Август 28, 2013, 09:53:41 am от Geniepro »
to iterate is human, to recurse, divine

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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Пробуем писать на O7
« Ответ #23 : Август 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...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #24 : Август 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 - можно.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Пробуем писать на O7
« Ответ #25 : Август 28, 2013, 11:44:41 am »
Так там expression без ограничений.
Где в репорте ты видишь такой запрет?

У меня сейчас разрыв шаблона...  :)
Я всегда думал что в седьмом обероне динамика именно так и делается...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #26 : Август 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', а следовательно и длину массива.
Y = λf.(λx.f (x x)) (λx.f (x x))

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #27 : Август 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;

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #28 : Август 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 вся фишка в работе с типами. Алгоритмы то тривиальны.
Y = λf.(λx.f (x x)) (λx.f (x x))

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Пробуем писать на O7
« Ответ #29 : Август 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'а не хотят принимать их...
to iterate is human, to recurse, divine

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