Pull to refresh

Comments 10

Откуда взялся такой императивный print в якобы чисто декларативном языке? Вы либо крестик снимите…
как раз все там декларативно и чисто, прочтите внимательнее начало поста habrahabr.ru/blogs/programming/112030/

причина в том, что запись

main --> print("Hello"), nl, print("World")
на самом деле является более короткой формой записи

main(IO0,IO) :- print("Hello",IO0,IO1), nl(IO1,IO2), print("World",IO2,IO)


где значения IO* символизируют значение «внешнего мира» до и после вызова соответствующих функций.
Есть ли что-то похожее на call-by-reference?

То есть

main(IO) :- print(«hi»,IO), print(«there»,IO).

как короткая форма для

main(IO0,IO1) :- print(«hi»,IO0,IO0'), print(«there»,IO0',IO1).

? Или это не имеет смысла в ЛП? (Просто в одном ФЯП call-by-reference помогает упростить «протаскивание» переменной линейного типа — полезно)
только в виде синтаксического сахара

main(!IO) :- print("hi",!IO), print("there",!IO).

Очень прикольно. И даже читается вроде.

Вот это:

:- type bf_state ---> bf_state(
left :: list(int),
cell :: int,
right :: list(int)
).

напоминает zipper для односвязного списка. :) Судя по описанию в тексте, так и используется.

Вопрос: есть ли какие-нибудь книжки по Mercury? Интересно, как там реализовать, например, структуру данных смежного списка с линейными типами.
Спасибо большое. :)

Почитаем-с.
Новая традиция — вместо Hello World писать интерпритатор brainfuck? :)
Хорошая традиция, а то Hello World только на проверку работоспособности компилятора годится. Может кто-нибудь сваяет такое на php? :)
Sign up to leave a comment.

Articles