(Благодарю за ответ Эндрю Кука, который предоставил ссылку на проект Уилера и Глории "Читаемый проект S-выражений Lisp" )
Ссылка выше - это проект, предназначенный для обеспечения читабельного синтаксиса для всех языков на основе s-выражений, включая Scheme и Clojure. Вывод таков: это можно сделать: есть способ иметь читаемый Лисп без скобок .
По сути, проект Дэвида Уилера заключается в добавлении синтаксического сахара к языкам, подобным Lisp, для обеспечения более современного синтаксиса, что не нарушает поддержку Lisp для специфичных для предметной области языков. Усовершенствования являются необязательными и обратно совместимыми, поэтому вы можете включить их столько, сколько захотите, и смешать их с существующим кодом.
Этот проект определяет три новых типа выражений:
- Фигурное-инфиксное-выражение. (+ 1 2 3) становится {1 + 2 + 3} в каждом месте, где вы хотите использовать инфиксные операторы любой арности. (Существует особый случай, который необходимо обрабатывать с осторожностью, если встроенное выражение использует несколько операторов, например {1 + 2 * 3} - хотя {1 + {2 * 3}} работает как положено).
- Neoteric-выражение. (f x y) становится f (x y) (требуется, чтобы между именем функции и ее параметрами не было пробела)
- Сладкое-выражение. Открывающих и закрывающих родителей можно заменить на (необязательно) питоноподобный семантический отступ . Сладкие выражения можно свободно смешивать с традиционными скобками s-выражений.
В результате получается Lisp-совместимый, но гораздо более читаемый код. Пример того, как новый синтаксический сахар улучшает читабельность:
(define (gcd_ a b)
(let (r (% b a))
(if (= r 0) a (gcd_ r a))))
(define-macro (my-gcd)
(apply gcd_ (args) 2))
становится:
define gcd_(a b)
let r {b % a}
if {r = 0} a gcd_(r a)
define-macro my-gcd()
apply gcd_ (args) 2
Обратите внимание, как синтаксис совместим с макросами, что было проблемой с предыдущими проектами, которые предназначались для улучшения синтаксиса Lisp (как описано Уилером и Глорией). Поскольку это просто сахар, конечной формой каждого нового выражения является s-выражение, преобразованное средством чтения языка перед обработкой макросов, поэтому макросы не нуждаются в особой обработке. Таким образом, проект «читаемый Лисп» сохраняет гомоичность, свойство, которое позволяет Лиспу представлять код как данные в языке, что позволяет ему быть мощной средой метапрограммирования.