LINUX.ORG.RU

продолжаем обдумывать инфиксный лисп


0

0

Доброго! Вчера мне нужно было найти небаланс begin-end-ов в Delphi. Открыл файл в emacs. Заменил все begin на (begin, end на end), try на (try, case на (case, {} на #|, ' на ". Затем сменил расширение на .lisp, и в лисп-моде нашёл искомое. Почему-то спецы Борланда за 15 лет не смогли научиться находить начало блока begin..end по его концу, хотя парсить паскаль они явно умеют... Оставим это на их совести и подумаем вот о чём.

В интерактивном интерпретаторе лиспа ввод выражения завершается нажатием Enter. Если при нажатии enter имеется небаланс скобок, то лисп понимает, что мы ввели ещё не всё выражение.

Что будет, если мы в инфиксном интерпретаторе ввели 2+2 и нажали Enter?

это значит, что мы хотим вычислить (+ 2 2) или что на следующей строчке мы ещё введём *4 и выражение будет (+ 2 (* 2 4)) ?

Практически, конечно, проблема решается: 1. можно потребовать ввода точки с запятой ; 2. можно требовать ввода специальной последовательности-терминатора, например, <eof>go<eof>, как это сделано в MS SQL. 3. можно сказать, что неоднострочное выражение должно быть заключено в скобки (хоть бы в begin..end).

Но что-то тут не так...

Если мы печатаем из лиспа: (print 2) (print '(- 2 2)) (print -2) то это получается просто три напечатанных выражения. Три раза вызовем read и получим их обратно.

Что делать в инфиксном случае? print(2); print(quote(-2+2)); print(-2);

Что мы прочитаем? Одно выражение: 2-2+2-2.

Значит, если *print-readably*, то нужно ко всему при печати добавлять скобки? (2) (-2+2) (-2)

Но тогда вот здесь уже точно засада:

(print '(foo bar)) (foo bar)

print(foo(bar)) (foo(bar)) если скобки не поставить, то это будет воспринято как два отдельных выражения quote(foo) и quote((bar)).

Как-то тут всё не настолько гладко...

Ы?

anonymous

>это значит, что мы хотим вычислить (+ 2 2) или что на следующей строчке мы ещё введём *4

Если ты хочешь интерактивно досчитывать результат, то нужно бросать страдать фигнёй и переходит на постфиксную, польскую нотацию.

Можно сразу Форт запустить.

2 2 +
4 *
.

KRoN73 ★★★★★
()

> Затем сменил расширение на .lisp

M+x lisp-mode не?

one_more_hokum ★★★
()
Ответ на: комментарий от KRoN73

> Если ты хочешь интерактивно досчитывать результат, то нужно бросать страдать фигнёй и переходит на постфиксную, польскую нотацию.

Нет,я хочу как в лиспе, чтобы я мог печатать в файл последовательность выражений и потом читать их read-om. В инфиксном синтаксисе нужны разделители для этого. Вот об этих разделителях и идёт речь.

den73 ★★★★★
()

В OCaml и F# эту проблему неэлегантно решили, вставляя ';;' в конце выражения в repl. В Haskell (hugs, ghci) это тупо конец строки, приходящийся на корректное выражение (то есть, они об этой проблеме просто не парятся).

anonymous
()
Ответ на: комментарий от anonymous

Ну, наверное, можно всё же иметь *print-readably* для случая, когда пишется последовательность выражений, которая будет всё заключать в скобки. И сделать, чтобы скобки можно было ставить вокруг всего.

den73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.