Упёрся. Есть такая простая вещь, как синтаксис.
Вот примеры:
ключ используется сам по себе, без значения
ls -l *.c
в лиспе ключ почти всегда используется в паре со значением
(make-foo :a 1 :b 2)
<img src="siski.png" alt="UML-диаграмма">
Но ведь есть и «синтаксис»
for i in a do
И сталкиваемся со следующими противоречиями: Если мы помечаем имя, то запись становится длиннее. Если мы не помечаем имя, то возможно возникновение неоднозначностей.
При этом в реальной жизни используется то одно правило, то другое. Не за что зацепиться, чтобы создать какие-то универсальные правила.
В языках типа С всё понятно - синтаксис там маленький и фиксированный. Все ключевые слова зарезервированы и не могут быть перепутаны с идентификаторами.
В языках с гомоиконностью, или просто в расширяемых языках так не получается. Сегодня я завёл переменную finally, а завтра в языке появилось ключевое слово finally и вот мы приехали.
В лиспе традиционно используются кейворды, например
(defsystem
:serial t
:description "Some utilities by Budden, mostly public domain"
:depends-on
(:alexandria :cl-fad :split-sequence :cl-utilities :named-readtables
:cl-ppcre
:iterate-keywords :swank :decorate-function :closer-mop)
)
Но с другой стороны, а зачем нам столько двоеточий? Если отвлечься от лисповой особенности, состоящей в том, что кейворды видны из любого пакета, ведь можно и так написать:
(defsystem
serial t
description "Some utilities by Budden, mostly public domain"
depends-on
(alexandria cl-fad split-sequence cl-utilities named-readtables
cl-ppcre
iterate-keywords swank decorate-function closer-mop)
)
Пока что моя идея состоит в том, что необязательные ключи будут начинаться с тире, как в командной строке. Обязательные будут писаться просто как слова, но синтаксис будет понимать, ожидается ли сейчас ключевое слово или данные, и так мы сможем устроить, чтобы у нас одно слово могло служить и элементом синтаксиса, и идентификатором.
Что для литералов структур (т.е. для записей вида «имя=значение, имя=значение» я налагаю требование, чтобы на каждой строке располагался или один элемент (имя или длинное значение) или целое число пар:
объект хрень
имя1
очень-длинное-значение-1
имя2 значение2
имя3 значение3 имя4 // здесь нас подстрахует парсер
имя5 значение 5 // несмотря на эту вторую ошибку
кно