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

标签 dynamic scheme lisp 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 的 send/public_send 方法,如果您熟悉 Ruby。

我最感兴趣的是适用于 Racket 的答案。

谢谢。

编辑; 而且我忘记提到可能有上百万个函数名称,所以 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

关于Racket中的动态函数调用;或从字符串中获取过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29460841/

相关文章:

emacs - 使用 plt-r5rs 而不是 Racket 调用 Geiser?

emacs - 在选定区域的 Ctrl+C 之前更改速度会激活复制命令,而不是允许在区域上执行其他命令

perl - 在 perl 中使运行时变量名称成为全局变量

android - 如何在 Android 的 tableLayout 中动态添加一行

javascript - 使用 javascript append 选择选项

javascript - 想要在 div 中向当前日期添加 1 个月

scheme - letrec/letrec* 比带有内部定义或命名的 let 更好的示例?

scheme - lisp 遍历列表

Lisp:原子和字符串

macros - Lisp 评估宏表达式中的变量