首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SICP练习2.04

SICP练习2.04
EN

Stack Overflow用户
提问于 2016-09-26 13:12:58
回答 1查看 89关注 0票数 2

我现在正在阅读练习2.04,它是conscarcdr的过程表示,在书中给出如下内容:

代码语言:javascript
复制
(define (cons x y)
  (lambda (m)
    (m x y)))

(define (car z)
  (z
    (lambda (p q)
      (p))))

注意,为了运行代码,我在代码中使用了带有以下序言的racket

代码语言:javascript
复制
#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返回一个函数。
  • 这个函数将另一个作为参数的函数应用于两个参数xy of cons
  • 这意味着通过调用cons,我们保留了将函数应用于这两个参数的可能性,并且能够将它们作为某个单元来处理。

关于car

  • car现在使用的事实是,我们可以将一个函数应用到给定给cons的两个值的单位上,方法是将一个函数作为函数的参数,然后从cons返回。
  • 它为该函数提供一个lambda表达式,该表达式总是返回两个给定值中的第一个。

用法

起初,我尝试了以下几种方法:

代码语言:javascript
复制
(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))))

然而,这会导致错误:

代码语言:javascript
复制
: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

代码语言:javascript
复制
(define x (cons 3 4))
(car x)

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

代码语言:javascript
复制
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]

我在这里做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-26 13:31:12

代码中有错误。而不是:

代码语言:javascript
复制
(define (car z)
  (z
    (lambda (p q)
      (p))))

您应该编写(请参阅book):

代码语言:javascript
复制
(define (car z)
  (z
    (lambda (p q)
      p)))

注意,在最后一行中,p是不带括号的。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39703866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档