【问题标题】:Putting a list in a parameter in scheme将列表放入方案中的参数中
【发布时间】:2012-11-13 13:55:00
【问题描述】:

所以我是使用 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))
    )
)

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

【问题讨论】:

    标签: list scheme guile


    【解决方案1】:

    您真的打算以这种命令式的方式编写一个过程吗?它看起来不太像 Scheme。在 GNU Guile 中评估您的过程会产生许多关于未绑定变量等的错误消息。set! 是对 Scheme 初学者的评估 ;) :) (SICP 在第 3 章中广泛处理了赋值)。您可以更轻松地使用函数式样式,而不会产生 set!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”等书籍。

    【讨论】:

    • 我确实最终使用了地图。这实际上是我第一次使用方案进行编程作业,所以我对此一无所知。它最终变得更小更简单。
    【解决方案2】:

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

    【讨论】:

    • 哇,原来这么简单。非常感谢。我让它工作,除了它不会放在列表中的最后一件事,但我应该能够很容易地解决这个问题。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2019-03-20
    相关资源
    最近更新 更多