Racket中的动态函数调用;或者从字符串中获取过程



我提前为这个可能很愚蠢的问题道歉:)

假设,我有一个类似的字符串列表

(define func-names '("add" "sub" "mul"))

也有类似定义的函数

(define (add x y)
  (+ x y))
(define (sub x y)
  (- x y))
(define (mul x y)
  (* x y))

正如您所看到的,列表中字符串的值与函数的名称相对应。我需要一种方法来遍历列表并调用与字符串值对应的函数。类似的东西

(define (all-ops x y)                                        
  (map (lambda (name) (string->proc name x y)) func-names))

其中string->proc是我要查找的。如果您熟悉Ruby,可以使用类似Ruby的send/public_send方法。

我最感兴趣的是适用于拉基特的答案。

谢谢。

编辑;我忘了提到可能有一百万个函数名,所以condmatch在这里使用会很乏味。

考虑制作一个将字符串映射到函数值的哈希表。

也就是说,你可以做如下:

#lang racket
(define (add x y)
  (+ x y))
(define ns (variable-reference->namespace (#%variable-reference)))
(define (string->procedure s)
  (define sym (string->symbol s))
  (eval sym ns))
(string->procedure "add")
((string->procedure "add") 1 2)

另请参阅http://blog.racket-lang.org/2011/10/on-eval-in-dynamic-languages-generally.html