(caadr exp) в переменной присваивания - PullRequest
2 голосов
/ 09 января 2020

Я читаю 4.1.2 Представление выражений SICP,

, которое определяет definition-variable.

  (define (definition? exp)
    (tagged-list? exp 'define))

  (define (definition-variable exp)
    (if (symbol? (cadr exp))
        (cadr exp)
        (caadr exp))) ;;

См. Условия

    (if (symbol? (cadr exp))
        (cadr exp)
        (caadr exp))) ;;

Я не очень уверен, что (caadr exp) вернулся? имеет значение null или '()

регистр переменной

(define ⟨var⟩ ⟨value⟩)

(cadr exp) возвращает второй элемент как переменную,

, но альтернативу регистру процедуры:

  (define (⟨var⟩ ⟨param₁⟩ … ⟨paramₙ⟩)
    ⟨body⟩)

выражение (caadr exp))) равно (car (car (cdr x)))

Поскольку cadr - это var, то caadr - это ноль?

1 Ответ

3 голосов
/ 09 января 2020

В случае процедуры (cadr exp) - это не имя, а список, первым элементом которого является имя.

         (cadr exp)
             |
             v
         +-------+
         |       |
 (define (f a b c) body)  <--- exp
          ^
          |
      (caadr exp)

Если вы оцениваете это:

(caadr '(define (⟨var⟩ ⟨param₁⟩ … ⟨paramₙ⟩) ⟨body⟩))
-->
(caar '((⟨var⟩ ⟨param₁⟩ … ⟨paramₙ⟩) ⟨body⟩))
-->
(car '(⟨var⟩ ⟨param₁⟩ … ⟨paramₙ⟩))
-->
⟨var⟩
...