如果您一定要使用表示函數名稱的符號列表,您可以使用apply
和eval
,但要注意: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
這就是你展示它是我有,但如果我嘗試使用'應用'形式,它不工作。 'at1'函數被定義,然後'lst'被創建。我現在告訴你,我仍然給出同樣的錯誤,我現在已經沒有想法了。 –
@PedroL。我更新了我的答案,看看這是你需要的... –
現在它的工作原理!我一直使用'apply'和'eval',就像你放的第一個例子。現在我必須調查一下名稱空間錨和那些東西,因爲我不知道它是怎麼回事。非常感謝。 –