История изменений
Исправление den73, (текущая версия) :
Тикль вообще весь в терминах строк
Это понятно, я ж с самого начала говорю о том, что это похоже на сломанные списки. Вопрос в том, можно ли починить и доделать до настоящих, чтобы не увеличить при этом сложность, но увеличить органичность и ортогональность.
Почитал man Tcl, там написано, что команда сначала разбивается по разделителям «\n» и ";", а уже потом бьётся на слова по пробелам с учётом {}"". Вот он, неявно заданный и негомоиконный двухуровневый список с разными разделителями на разных уровнях. Тело if, заключённое в фигурные скобки, тоже будет так разбито, но уже во время выполнения if. В процессе чтения if - это просто строка, ограниченная фигурными скобками. Т.е. токенизатор при чтении if снимает фигурные скобки и сохраняет получившуюся строку как тело одной из ветвей. А если эта ветвь выбрана, то токенизатор снова бьёт её на токены по \n; , потом на слова и получает новое тело составного оператора. Вроде нам это и нужно, но нужно сделать это гомоиконным и вынести токенизатор с этапа выполнения на этап чтения файла. Тогда и получится современный лисп (не f-expr, а больше похожий на CL и Scheme), и с более хорошим синтаксисом.
Попробуем так (граница списков условно обозначается знаками <>).
# lisp
(if 0 (puts 1) (puts '((a) b)))
# tcl (оказывается, слово else можно опустить!)
if 0 {puts 1} {puts ???}
# tclisp как бы мы хотели в идеале
<if 0 <puts 1> <puts <quote <<a> b>>>>
# tclisp синтаксис с воображаемыми скобками
if 0 <
puts 1
> else <
puts <quote
<a> b
>>
<if 0 <<puts 1>> <<puts <quote <<a> b>>>>>
'(1
2
3
4)
(1
2
3
4)
<<<1> <2> <3> <4>>>
Исходная версия den73, :
Тикль вообще весь в терминах строк
Это понятно, я ж с самого начала говорю о том, что это похоже на сломанные списки. Вопрос в том, можно ли починить и доделать до настоящих, чтобы не увеличить при этом сложность, но увеличить органичность и ортогональность.
Почитал man Tcl, там написано, что команда сначала разбивается по разделителям «\n» и ";", а уже потом бьётся на слова по пробелам с учётом {}"". Вот он, неявно заданный и негомоиконный двухуровневый список с разными разделителями на разных уровнях. Тело if, заключённое в фигурные скобки, тоже будет так разбито, но уже во время выполнения if. В процессе чтения if - это просто строка, ограниченная фигурными скобками. Т.е. токенизатор при чтении if снимает фигурные скобки и сохраняет получившуюся строку как тело одной из ветвей. А если эта ветвь выбрана, то токенизатор снова бьёт её на токены по \n; , потом на слова и получает новое тело составного оператора. Вроде нам это и нужно, но нужно сделать это гомоиконным и вынести токенизатор с этапа выполнения на этап чтения файла. Тогда и получится современный лисп (не f-expr, а больше похожий на CL и Scheme), и с более хорошим синтаксисом.
Попробуем так (граница списков условно обозначается знаками <>).
# lisp
(if 0 (puts 1) (puts '((a) b)))
# tcl (оказывается, слово else можно опустить!)
if 0 {puts 1} {puts ???}
# tclisp как бы мы хотели в идеале
<if 0 <puts 1> <puts <quote <<a> b>>>>
# tclisp синтаксис с воображаемыми скобками
if 0 <
puts 1
> else <
puts <quote
<a> b
>>
<if 0 <<puts 1>> <<puts <quote <<a> b>>>>>
'(1
2
3
4)
(1
2
3
4)
<<1> <2> <3> <4>>