Упёрся. Есть такая простая вещь, как синтаксис.
Вот примеры:
ключ используется сам по себе, без значения
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 // несмотря на эту вторую ошибку
кно


