我现在正在阅读练习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和y of cons。cons,我们保留了将函数应用于这两个参数的可能性,并且能够将它们作为某个单元来处理。关于car
car现在使用的事实是,我们可以将一个函数应用到给定给cons的两个值的单位上,方法是将一个函数作为函数的参数,然后从cons返回。用法
起初,我尝试了以下几种方法:
(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]我无法理解我的代码有什么问题,所以我在其他人的解决方案中查找了一些使用示例。一个在http://community.schemewiki.org/?sicp-ex-2.4上
(define x (cons 3 4))
(car x)但令我惊讶的是,它不起作用!wiki中的解决方案似乎是错误的。我得到以下错误:
application: not a procedure;
expected a procedure that can be applied to arguments
given: 3
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:42:0: (car x)
context...:
/home/xiaolong/development/LISP/Racket/SICP/exercise-2.04-procedural-representation-of-pairs.rkt: [running body]我在这里做错什么了?
发布于 2016-09-26 13:31:12
代码中有错误。而不是:
(define (car z)
(z
(lambda (p q)
(p))))您应该编写(请参阅book):
(define (car z)
(z
(lambda (p q)
p)))注意,在最后一行中,p是不带括号的。
消息:application: not a procedure意味着p不是一个过程(实际上是一个数字),而使用符号(p),您将它称为一个无参数过程。
https://stackoverflow.com/questions/39703866
复制相似问题