2014-04-25 60 views
0

在方案中,我怎麼能訪問某個功能列表內,一個變量傳遞給該函數?函數方案列表 - 如何訪問列表中的函數?

(define f 
     '((lambda (n) (+ n 2)) 
      (lambda (n) (* n 2)) 
      (lambda (n) (* n n)))) 

我已經定義了其中有3個不同的功能,這個名單f和我想知道我可以鍵入方案能夠說通3到列表中的第二個功能?

我認爲像((cadr f) 3)的工作,但我似乎無法弄清楚,任何幫助,將不勝感激我真的很新的方案。

回答

4

你在這裏的不是功能列表,但符號列表清單。也包含一些符號......因爲你引用了所有內容,所以一切都被引用,只有數字和列表,字符串是自引用的。如果你想保持列表中的對象,你有兩個選擇:

創建一個列表,而不是引用它。

(define f 
     (list (lambda (n) (+ n 2)) 
       (lambda (n) (* n 2)) 
       (lambda (n) (* n n)))) 

僞報價每一個功能,並解除引用聲明

(define f 
     `(,(lambda (n) (+ n 2)) 
      ,(lambda (n) (* n 2)) 
      ,(lambda (n) (* n n)))) 

說實話,明確名單似乎比僞報價版本更好一點。

你的報價版本給大家的是:

(define f 
     (list (list 'lambda (list 'n) (list '+ 'n 2)) 
       (list 'lambda (list 'n) (list '* 'n 2)) 
       (list 'lambda (list 'n) (list '* 'n 'n)))) 

報價不是氣質列表的簡寫。這是一個不評價任何東西的簡寫。

+0

我認爲(拉姆達(ARG)(表達式))是匿名函數定義的格式? –

+0

它是,但是因爲你引用了它,你最終會得到一個符號列表。像這樣:'(list'lambda(list'arg)(list'expr))' –

+0

@KaileeKerr Scheme從左到右評估,當它看到一個報價時,它不評估任何內容。引用不是簡化列表的簡寫。這是一個不評價任何東西的簡寫。 –