Доброго! Вчера мне нужно было найти небаланс 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)).
Как-то тут всё не настолько гладко...
Ы?