2010-03-30 72 views
10

好吧,這可能聽起來像一個荒謬的問題,但你如何返回計劃列表?計劃如何創建列表

+0

你可能會覺得這有幫助:http://www.r6rs.org/。大多數情況下它不是過於技術性的,可以回答許多這樣的問題。這是一個非常有用的指導,瞭解Scheme程序是如何製作Scheme中最常見的數據結構的。 – avpx 2010-03-30 01:08:50

回答

9

您可能只需要:'(2 3 5 7 11)(list 2 3 5 7 11)(cons 2 (cons 3 '()))

下面是從一個函數返回一個列表的例子:

(define returnlist 
    (lambda(a b c) 
    (cons a (cons b (cons c '()))) 
)) 

(returnlist 2 3 4) 

返回值將是列表

您也可以通過指定的元素,將其添加到列表構造列表:(list 2 3 4)

4

另一個不那麼衆所周知的方式做到這一點:

> ((lambda x x) 2 3 5 7 11) 
(2 3 5 7 11) 

也就是說,「列表」功能本身可以定義爲:

> (define list (lambda x x)) 
19

基礎上看到您的一些其他問題,我想你可能有讓你的頭上纏核心功能的概念麻煩語言如Scheme。

在您正在學習Scheme(新手)的級別中,您編寫的每個函數都有一個輸入和一個輸出,並且每個函數的主體都是單個表達式。函數返回表達式評估的值。沒有必要像在Java或C這樣的命令式語言中顯式「返回」任何東西;它只是評估表達式的直接後果。

函數的主體是單個表達式。它不像Java,其中一個方法的主體由一系列指令組成:

do this 
then do that 
then do something else 
then return something (maybe) 

Scheme函數計算單個表達式;而已。下面是一個簡單的函數,增加了5任何數目作爲參數被傳遞給:

(define (add5 x) 
    (+ x 5)) 

的功能的主體是(+ x 5),這僅僅是要被評估的表達式。插入x的值,將+(加法)函數應用於x和5,並返回結果。

列表沒有太大的不同。所有你需要的是一個表達式,將構建一個列表。兩個已經提到:列表用於從頭創建一個列表,如果你已經擁有所有的元素; 缺點用於將單個元素添加到現有列表中,並且經常以遞歸方式使用。

下面是要消耗數n並建立列表(n n-1 n-2 ... 0)

(define (makelist n) 
    (if (= n 0) 
    (list 0)      ; base case. Just return (0) 
    (cons n (makelist (- n 1))))) ; recursive case. Add n to the head of (n-1 n-2 ... 0) 

在鹼和遞歸情況下,兩個功能,一個列表是通過簡單地評估使用的列表建設功能之一表達式返回。

這是另一個例子。這一個使用我們add5函數5添加到數字列表(LON)的每一個元素:

(define (add5list lon) 
    (if (null? lon) 
    `()     ; base case: lon is empty. Return an empty list. 
    (cons (add5 (car lon)) (add5list (cdr lon))))) ; recursive case. 
                ; Add 5 to the head of lon and prepend it to the tail of lon 

同樣,基數和遞歸案件通過評估導致列表中的表達式返回列表。

要記住關於Scheme的關鍵是所有函數都返回一些東西,而某些東西只是評估表達式的結果。 Scheme函數的主體是單個表達式。