【问题标题】:application: not a procedure mismatch error应用程序:不是程序不匹配错误
【发布时间】:2019-02-13 06:00:28
【问题描述】:

我正在尝试实现一种对单元格的读写功能。

(define (read-write-get cell) (cell (list)))
(define (read-write-set cell x) (cell (list x)))

(define (read-write-cell x)
   (let ((cell '()))
       (read-write-set cell x)))

(define w1 (read-write-cell 10))
(check-equal? 10 (read-write-get w1))

我不断收到错误

应用程序:不是程序; 期望一个可以应用于参数的过程 给定:'() 论据...: 错误跟踪...:

【问题讨论】:

标签: scheme lisp racket non-procedure-application


【解决方案1】:

在 Scheme (x y) 中表示将函数 x 应用于参数 y。所以

(define (read-write-set cell x) (cell (list x)))

定义了一个函数read-write-set,当使用作为函数的第一个参数调用该函数时,将该函数cell应用于评估(list x)的结果(它构建一个具有唯一元素的列表,第二个参数)。

然后,在:

(define (read-write-cell x)
   (let ((cell '()))
       (read-write-set cell x)))

您使用第一个参数调用read-write-set,它不是一个函数,而是一个空列表(因为cell 在let 中被分配给'())。

所以,“不是程序;期望一个过程”是指read-write-set的第一个参数的值,它不是一个过程,而是一个列表。我不清楚read-write-getread-write-set 的预期行为,所以我无法建议如何纠正它们。

【讨论】:

  • 我写了一些测试来描述我正在尝试实现的内容 (define a1 (read-write-cell 25)) (check-equal?25 (read-write-get a1)) (define a2 (read-write-set a1 30)) (check-equal?30 (read-write-get a2))
  • @JohnSmith,您应该决定如何实现该单元。作为闭包(即具有环境的函数)?作为可修改的数据结构?或者还有什么?您要测试的函数是单元抽象的接口,但单元本身必须以某种特定、具体的方式实现。
  • 我想用闭包来实现它。你知道我是怎么做到的吗?
  • @JohnSmith,您可以在 molbdnilo 评论中提供的链接中找到详细讨论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多