2

所以我是使用 Scheme/Guile 的新手,并且有一个必须接受 2 个输入的任务;一个简单的变量和一个列表。

然后我将变量添加到列表中的每个数字并打印出来。我已经加载了它,但是当我输入这个时:

(add 1 (1 2 3))

我收到此错误:

Backtrace:
  39: 0* [add 1 ...
  39: 1*  [1 2 3]

standard inout:39:8: In expression (1 2 3):
standard input:39:8:wrong type to appy: 1
ABORT: (misc-error)

这是我目前拥有的代码。

(define a (list a))
(define (add y a)
    (define x 0)
    (while (< x (length a))
        (display (+ y (car a)))
        (newline)
        (set! a (cdr a))
        (set! x (+ x 1))
    )
)

我的问题是:
如何让列表在参数中起作用?我在网上环顾四周,但没有找到太多可以解决这个问题的方法。非常感谢您能给我的任何帮助。

4

2 回答 2

2

您收到错误是因为(1 2 3)告诉它1使用两个参数调用函数,2并且3. 要创建包含 1、2 和 3 的列表,请使用(list 1 2 3).

于 2012-11-26T05:11:18.120 回答
0

您真的打算以这种命令式的方式编写程序吗?它看起来不太像 Scheme。在 GNU Guile 中评估您的过程会产生许多关于未绑定变量等的错误消息。set!对于 Scheme 的初学者来说是评估;) :) (SICP 在第 3 章中广泛地处理了赋值)。set!您可以在功能样式中更轻松地做到这一点,而不会产生and的副作用display

如果您已经了解映射和高阶函数,则可以执行以下操作:

(define (add x)
  (lambda (y) (+ x y)))

(map (add 1) (list 1 2 3))
===> (2 3 4)

如果没有,请自己编写一个递归过程:

(define (add-to-list x list)
  (if (null? list)
      '()
      (cons (+ x (car list))
            (add-to-list x (cdr list)))))

(add-to-list 1 '(1 2 3))
===> (2 3 4)

为了学习递归思维,请查阅 SICP、HTDP 或“The litte Schemer”等书籍。

于 2012-11-26T12:32:28.457 回答