2012-11-26 18 views
1

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

我的問題是如何讓列表在參數中工作。我在網上瀏覽過,但沒有找到很多解決這個問題。 非常感謝您提供的任何幫助。

回答

2

由於(1 2 3)指示它使用兩個參數23來調用函數1,所以出現錯誤。要創建包含1,2和3的列表,請使用(list 1 2 3)

+0

哇,這很簡單。非常感謝你。除了它不會在列表中的最後一個東西,但我應該能夠解決這個問題。再次感謝。 – bigfetz

0

你真的打算以這種迫切的方式編寫程序嗎?它看起來不像方案。在GNU Guile中評估你的程序會產生很多關於未綁定變量的錯誤消息。set!對於Scheme的初學者是eval的;):)(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或「Litte Schemer」等書籍。

+0

我其實是最終使用地圖。這實際上是我第一次將計劃用於編程任務,所以我不知道它。它最終變得更小更簡單。 – bigfetz