Racket中的动态函数调用;或从字符串中获取过程
Dynamic function call in Racket; or get a procedure from a string
我提前为这个可能很愚蠢的问题道歉:)
假设,我有一个字符串列表,例如
(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 的答案。
谢谢。
编辑;
而且我忘了说函数名可能有一百万个,所以cond
、match
用在这里会很乏味。
考虑制作一个将字符串映射到函数值的散列 table。
话虽如此,您可以进行如下操作:
#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
我提前为这个可能很愚蠢的问题道歉:)
假设,我有一个字符串列表,例如
(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 的答案。
谢谢。
编辑;
而且我忘了说函数名可能有一百万个,所以cond
、match
用在这里会很乏味。
考虑制作一个将字符串映射到函数值的散列 table。
话虽如此,您可以进行如下操作:
#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