Это бросило меня в тупик; до этого момента я предполагал, что формальные параметры всегда заключались в список:
Обратите внимание, что такие вещи, как (a . args)
и (a b . args)
, на самом деле тоже не списки. (a . args)
- это пара, где car
- это символ a
, а cdr
- это символ args
. (a b . args)
- это пара, где car
- это символ a
, а cdr
- это (пара, в которой car
- это символ b
, а cdr
- это символ args
). Некоторое время это выглядит как список, с a
и b
и так далее, но так как он не заканчивается нулевым / пустым списком, это не совсем правильный список. Подобные структуры часто называют неправильными списками. Если вы хотите, вы можете прочитать немного о записи с точечной парой здесь или где-то еще ...
С (. args)
Я бы сказал что-то вроде «это пара, где cdr
- это символ args
». Или, может быть, это получится как «пара, где car
есть, а cdr
- args
». В любом случае это не имеет большого смысла, и, как сказал Крис Джестер-Янг, это не совсем правильная Схема.
Итак. Такие вещи, как (a b . args)
, являются просто обычными точечными парами для обозначения вещей, которые не равны нулю в последнем cdr
. Если формальная вещь параметров в Схеме может быть одним из этих неправильных списков или надлежащим списком или просто символом, то определение формальной вещи параметров должно быть чем-то вроде: формальная вещь параметров должна быть нулевой, символом, или пара, где car
является символом, а cdr
является формальным параметром.
(Что я думаю, что это довольно крутая вещь, которая делает довольно элегантный способ привязки аргументов к параметрам. Например, вы смотрите на формальные параметры-вещи, и если это символ, вы привязываете список аргументов к этому и если это пара, вы связываете car
аргументов с cdr
формальной вещи-аргумента и повторяете cdr
формальной вещи-аргумента / аргумента (о, и если это ноль, то вы, как и все, сделали или что-то в этом роде. Это кажется мне немного более красивым, чем в Common Lisp, "и если символ в car
равен &rest
, то вы привязываете остальные аргументы к символу после этого".)