将字符串转换为 lambda/value

Converting string into lambda/value

我想让下面的代码起作用:

(define fn.str "(lambda (x) (displayln x)")
(define fn.callable (string->lambda fn.str))
; and then 2 next lines should be valid
(fn.callable 123)
(apply fn.callable '(321))

但我能得到的最好结果是评估字符串并获得输出,而不是 我的目标是获得实际持有价值(在这种情况下为 λ)。

总的来说,这也是想要的效果:

(define val.num "500")
(define val.li "'(1 2 3)")
(define val.fn "(λ (a) a)")
(define num (string->value val.num)) ; => num is now holding 500
(define li (string->value val.li)) ; => list '(1 2 3)
(define fn (string->value val.fn)) ; => callable lambda

也许我已经足够接近解决方案了,但是它有难闻的气味。

更多信息:

你说得对 - 从字符串评估代码是一种糟糕的代码味道......也许有更好的方法来完成你想要完成的事情。无论如何,这是一个可能的解决方案:

(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))

(define (eval-string str)
  (eval (call-with-input-string str read) ns))

它按照示例输入的要求工作:

(define fn.str "(lambda (x) (displayln x))")
(define fn.callable (eval-string fn.str))
(fn.callable 123)
=> 123

(apply fn.callable '(321))
=> 321

(define val.num "500")
(eval-string val.num)
=> 500

(define val.li "'(1 2 3)")
(eval-string val.li)
=> '(1 2 3)

(define val.fn "(λ (a) a)")
(eval-string val.fn)
=> #<procedure>