SICP练习2.04

时间:2016-09-26 13:12:58

标签: scheme racket sicp cons

阅读SICP我现在处于练习2.04,这是conscarcdr的程序表示,如下所示:

(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}}。
  • 它为lambda表达式提供该函数,该表达式始终返回两个给定值中的第一个。

用法

起初我尝试了以下内容:

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]

我在这里做错了什么?

1 个答案:

答案 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),您将其称为无参数过程。