2014-11-23 1 views
0

Я пытаюсь создать специальную функцию сгибания.Индексирование вложенных котировок и его недокументирование в схеме

У меня проблема с котировками, особенно их вложенными. Похоже, что они иногда интерпретируются как начало списка, а иногда и как цитата.

Скажем у меня есть следующий код:

'(x '(a b c)) 

Тогда:

(car '(x '(a b c))) 

Вернется: х. В то время как:

(cadr '(x '(a b c))) 

Вернется: '(a b c). Что это значит? Это список? если да, то почему:

(caadr '(x '(a b c))) 

Возврат: ссылка. Каково значение этой цитаты? Есть ли способ указать такие списки? И если да, есть ли способ их раскрыть?

ответ

3

Когда мы оцениваем цитируемое выражение, помните, что это выражение: 'x - это просто сокращение для этого: (quote x). Например:

'(x '(a b c)) 

эквивалентно:

(quote (x (quote (a b c)))) 

Теперь это выражение также возвращает цитируемое выражение, которое происходит, чтобы начать с еще один цитируемое выражение:

(cadr (quote (x (quote (a b c))))) 
       --------------- 
=> ''(a b c) 

Это более очевидно в следующем примере, где мы в итоге получаем сам символ 'quote:

(caadr (quote (x (quote (a b c))))) 
        ----- 
=> 'quote 

Для последней части вопроса: если вы хотите, чтобы интерпретировать внутренний список как список и не в кавычках выражения, то не процитировать его вообще:

(cadr '(x (a b c))) 
=> '(a b c) 

конечно, мы могли бы также оставить вторую quote и eval сокровенного список, но это хлопоты и potentially evil:

(define-namespace-anchor a) 
(define ns (namespace-anchor->namespace a)) 

(eval (cadr '(x '(a b c))) ns) 
=> '(a b c) 

Или мы можем использовать quasiquoting and unquoting:

(cadr `(x ,'(a b c))) 
=> '(a b c) 
+0

Справа, есть. Благодарю. – StationaryTraveller

+1

@StationaryTraveller отлично! см. мое последнее изменение, для некоторых дополнительных разъяснений –

Смежные вопросы