2014-04-22 50 views
0

我有一個像這樣的列表 - >(define l '(at1 at2 at3))其中at1是一個函數的名稱。當我嘗試將該值作爲函數的名稱(即(at1 value1 value2))時,我獲得:嘗試在列表中使用參數,如函數名稱在計劃

application:not a procedure; 預計可應用於參數的程序

,因爲at1是列表('valueofat1)。我試圖使用applylist->string,但兩者都不起作用。我究竟做錯了什麼?我如何使用給定位置中的列表值作爲函數?

回答

0

如果您一定要使用表示函數名稱的符號列表,您可以使用applyeval,但要注意:eval is evil,您應該避免使用它!

; some functions 
(define (at1 x y) (+ x y)) 
(define (at2 x y) (- x y)) 
(define (at3 x y) (* x y)) 

; a list of symbols named like the functions 
(define lst '(at1 at2 at3)) 

; operands 
(define value1 30) 
(define value2 12) 

; obtain evaluation namespace 
(define-namespace-anchor a) 
(define ns (namespace-anchor->namespace a)) 

; apply the first function from the list of function names 
(apply (eval (car lst) ns) (list value1 value2)) 
     ^      ^
evaluate operator   list of operands 

以上將返回42。我有這樣的感覺,你正在努力與XY problem,你是真的試圖完成?使用函數列表而不是符號列表代表函數名稱是不是更好的主意?我的意思是,像這樣:

; some functions 
(define (at1 x y) (+ x y)) 
(define (at2 x y) (- x y)) 
(define (at3 x y) (* x y)) 

; a list of functions 
(define lst (list at1 at2 at3)) 

; operands 
(define value1 30) 
(define value2 12) 

; apply the first function from the list of functions 
((car lst) value1 value2) 
=> 42 
+0

這就是你展示它是我有,但如果我嘗試使用'應用'形式,它不工作。 'at1'函數被定義,然後'lst'被創建。我現在告訴你,我仍然給出同樣的錯誤,我現在已經沒有想法了。 –

+0

@PedroL。我更新了我的答案,看看這是你需要的... –

+1

現在它的工作原理!我一直使用'apply'和'eval',就像你放的第一個例子。現在我必須調查一下名稱空間錨和那些東西,因爲我不知道它是怎麼回事。非常感謝。 –