LINUX.ORG.RU

История изменений

Исправление 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>>>>>
Выглядит годно, хотя тело if оказывается списком списков, т.е. начинает путаться под ногами неявный progn. Это может быть неудобно. Чтобы в явном виде записать однострочный if, придётся поставить ещё одну пару скобок, это неинтуитивно после любого языка.
'(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>>>>>
Выглядит годно, хотя тело if оказывается списком списков, т.е. начинает путаться под ногами неявный progn. Это может быть неудобно. Чтобы в явном виде записать однострочный if, придётся поставить ещё одну пару скобок, это неинтуитивно после любого языка.
'(1
  2
  3
  4)
В тиклиспе же из
(1 
 2
 3 
 4)
Получится
<<1> <2> <3> <4>>