SICP 4.1.2中definition-variable的(caadr exp)返回值咨询
(caadr exp) in SICP's Definition Handling Let's break this down clearly—your question cuts to a key detail of how Scheme parses definitions, so it's a great one to unpack.
First, let's recap the two valid define forms covered in SICP 4.1.2:
- Variable definition:
(define ⟨var⟩ ⟨value⟩)
Here,(cadr exp)directly grabs the symbol⟨var⟩(for example, in(define x 5),(cadr exp)returnsx). - Procedure definition:
(define (⟨var⟩ ⟨param₁⟩ … ⟨paramₙ⟩) ⟨body⟩)
This is syntactic sugar for(define ⟨var⟩ (lambda (⟨param₁⟩ … ⟨paramₙ⟩) ⟨body⟩)). Unlike variable definitions,(cadr exp)here isn't a single symbol—it's the list(⟨var⟩ ⟨param₁⟩ … ⟨paramₙ⟩).
Now, (caadr exp) is shorthand for (car (car (cdr exp)))—let's use a concrete example to see what it does:
Take the procedure definition (define (add a b) (+ a b)):
(cdr exp)gives((add a b) (+ a b))(car (cdr exp))(akacadr exp) gives(add a b)(car (cadr exp))(akacaadr exp) givesadd—a symbol, notnullor'().
Why it never returns null or '()
In valid Scheme syntax (per SICP's rules), a procedure definition's (⟨var⟩ ⟨param₁⟩ …) part must start with a symbol (the procedure name). That list can't be empty, and its first element can't be null—so (caadr exp) will always resolve to a valid symbol (the name of the procedure being defined).
Even for edge cases like a procedure with no parameters: (define (foo) 42)—(cadr exp) is (foo), so (caadr exp) still returns foo, not an empty value.
内容的提问来源于stack exchange,提问作者Wizard

