Это бросило меня за OOP; до этого момента я полагал, формальные параметры всегда были заключены в списке:
Обратите внимание, что такие вещи, как (a . args)
и (a b . args)
не действительно перечисляет либо. (a . args)
- это пара, где car
является символом a
, а cdr
является символом args
. (a b . args)
- это пара, где car
является символом a
, а cdr
(пара, где car
является символом b
, а cdr
- это символ args
). Он выглядит как список на некоторое время, с a
и b
, и это, но поскольку оно не заканчивается в null/пустом списке, это не совсем правильный список. Подобные структуры часто называют неправильными списками. Если вы хотите, вы можете прочитать немного о пунктирных парах нотации here, или где-нибудь еще ...
С (. args)
я бы, возможно, что-то вроде «это пара, где cdr
символа args
».Или, может быть, это получилось как «пара, где car
есть и cdr
- args
». В любом случае это не будет иметь большого смысла, и, как сказал Крис Шестер-Янг, это действительно не схема.
So. Такие вещи, как (a b . args)
, являются просто регулярными пунктирными обозначениями для размещения вещей, которые не равны нулю в последних cdr
. Если формальные параметры-вещи в Схеме могут быть одним из тех неправильных списков или надлежащим списком или просто символом, то определение формальных параметров-вещей должно быть примерно таким: формальные параметры-вещи должны быть нулевыми, символами, или пара, где car
является символом, а cdr
является формальным параметром.
(Которая, по моему мнению, является довольно классной штукой, которая делает довольно элегантный способ привязки аргументов к параметрам. Например, вы смотрите на формальные параметры-вещи, и если это символ, вы связываете список аргументов с что, и если это пара, вы связываете аргументы car
с аргументами формальных параметров и возвращаете по cdr
формальных параметров-вещей/аргументов (ах, а если это нулевое значение, то вы сделались или что-то еще). ударяет меня как немного красивее, чем обычный Lisp-способ ", и если символ в car
равен &rest
, вы связываете остальные аргументы с символом после этого".)
В качестве бонуса определение 'list' is '(define list (lambda xx))'. – erjiang