阅读SICP我现在处于练习2.04,这是cons
,car
和cdr
的程序表示,如下所示:
(define (cons x y)
(lambda (m)
(m x y)))
(define (car z)
(z
(lambda (p q)
(p))))
注意,为了运行代码,我在代码中使用racket
和以下前导码:
#lang racket
(define (Mb-to-B n) (* n 1024 1024))
(define MAX-BYTES (Mb-to-B 64))
(custodian-limit-memory (current-custodian) MAX-BYTES)
我也试过#lang scheme
无济于事。
以下是我的理解:
cons
cons
返回一个函数。x
的{{1}}和y
两个参数。cons
,我们可以将函数应用于这两个参数,并且可以将它们视为某个单元。cons
car
现在使用这样一个事实:我们可以通过给函数作为函数的参数将函数应用于给定car
的2个值的单位,我们从{返回} {1}}。起初我尝试了以下内容:
cons
然而,这会导致错误:
cons
我无法理解我的代码出了什么问题,所以我在其他人的解决方案中查找了一些用法示例。一个是http://community.schemewiki.org/?sicp-ex-2.4:
(car (cons 1 2))
(car (cons 2 3))
(car (cons (cons 1 1) (cons 2 2)))
(car (car (cons (cons 1 1) (cons 2 2))))
但令我惊讶的是,它不起作用!维基解决方案似乎是错误的。我收到以下错误:
:racket -l errortrace -t exercise-2.04-procedural-representation-of-pairs.rkt
application: not a procedure;
expected a procedure that can be applied to arguments
given: 1
arguments...: [none]
errortrace...:
/home/xiaolong/development/LISP/Racket/SICP/exercise-2.04-procedural-representation-of-pairs.rkt:24:6: (p)
/home/xiaolong/development/LISP/Racket/SICP/exercise-2.04-procedural-representation-of-pairs.rkt:33:0: (car (cons 1 2))
context...:
/home/xiaolong/development/LISP/Racket/SICP/exercise-2.04-procedural-representation-of-pairs.rkt: [running body]
我在这里做错了什么?
答案 0 :(得分:6)
您的代码中有错误。而不是:
(define (car z)
(z
(lambda (p q)
(p))))
你应该写(参见book):
(define (car z)
(z
(lambda (p q)
p)))
请注意,在最后一行p
没有括号。
消息:application: not a procedure
表示p
不是一个过程(它实际上是一个数字),而使用符号(p)
,您将其称为无参数过程。