Схема: списки из трех пунктирных элементов, возвращающихся странным образом (например, инфиксный оператор?) - PullRequest
6 голосов
/ 17 сентября 2011

Я новый ученик Схемы / Ракетки, поэтому прошу прощения за любые явные синтаксические ошибки.

Сегодня в классе пришли к выводу, что список схем '(a, b, c) должен быть недействительным, но когда мы его запустили, он вернул:

>'(a . b . c)  
(b a c)

Что не имеет смысла. Afaik, переводчик должен создать cons-ячейку с машиной 'a и cdr' b, а 'c должен быть недействительным. Тем не менее, переводчик делает что-то действительно странное здесь. Это работает со схемой #lang, ракеткой #lang и другими. Мы используем DrRacket в качестве переводчика.

Интересно, что

>'(a . b . c . d)

выдает исключение и умирает.

Мне очень любопытно, и мне хотелось бы понять это, поскольку я новичок в этом языке. Google был очень бесполезен (вероятно, так как условия поиска довольно неоднозначны) Спасибо!

EDIT: Это может быть потому, что '(a . b . c) интерпретируется с b как инфиксный оператор. Например: >(4 . + . 6) возвращает 10. Возможно, интерпретатор использует b как оператор? то есть (b a c) как (+ 4 6), инфиксное.

Эксперимент говорит:

>(define b +)  
>(define a 4)  
>(define c 6)  
>(a . b . c)  
10

Так что я думаю, что это решает проблему, но я все еще не до конца понимаю использование "." оператор в этом случае. Я думаю, что мы решили это, но любая дополнительная информация будет принята с благодарностью!

Ответы [ 2 ]

8 голосов
/ 17 сентября 2011

Краткий ответ: вы получили это. Для получения дополнительной информации об использовании точек в Racket см. Документацию по infix в документации по Racket.

4 голосов
/ 17 сентября 2011

Это особенность считывателя Racket.(См. Ответ Джона.)

Для других реализаций вы можете вместо этого использовать читатель читаемые S-выражения , чтобы иметь возможность читать выражения инфикса.Он использует фигурные скобки.например, {3 + 4} читается как (+ 3 4).Еще более особенным (чем инфикс-ридер Racket) вы можете использовать {3 + 4 + 5} или {3 + 4 + 5 + 6};они будут читать как (+ 3 4 5) и (+ 3 4 5 6) соответственно.

...