Scheme SICP练习2.04

Scheme SICP练习2.04,scheme,racket,sicp,cons,Scheme,Racket,Sicp,Cons,阅读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-

阅读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
    返回一个函数
  • 此函数将另一个函数作为参数应用于
    cons
    的两个参数
    x
    y
  • 这意味着通过调用
    cons
    我们保留了将函数应用于两个参数的可能性,并且能够将它们作为一个单元来处理
关于
car
  • car
    现在使用了这样一个事实,即我们可以将一个函数应用于给定给
    cons
    的2个值的单位,方法是将一个函数作为参数赋给该函数,我们从
    cons
    返回该函数
  • 它为该函数提供一个lambda表达式,该表达式始终返回两个给定值中的第一个
用法 首先,我尝试了以下方法:

(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]
我无法理解我的代码出了什么问题,所以我在别人的解决方案中查找了一些使用示例。一个是关于:

但令我惊讶的是,它不起作用!维基中的解决方案似乎是错误的。我得到以下错误:

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]

我做错了什么?

您的代码中有一个错误。而不是:

(define (car z)
  (z
    (lambda (p q)
      (p))))
您应该写下(请参阅):

注意,在最后一行中,
p
没有括号


消息:
application:nota procedure
意味着
p
不是一个过程(它实际上是一个数字),而使用符号
(p)
则将其称为无参数过程。

哦,我的天。。。那对括号是怎么到那儿的?——“谢谢!
(define (car z)
  (z
    (lambda (p q)
      (p))))
(define (car z)
  (z
    (lambda (p q)
      p)))