将字符串转换为 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
也许我已经足够接近解决方案了,但是它有难闻的气味。
更多信息:
- 那些字符串从外部进入程序(file/user 输入)。
- Extracted/parsed 值应该绑定到某些东西(例如哈希 table)以便进一步访问。
你说得对 - 从字符串评估代码是一种糟糕的代码味道......也许有更好的方法来完成你想要完成的事情。无论如何,这是一个可能的解决方案:
(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>
我想让下面的代码起作用:
(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
也许我已经足够接近解决方案了,但是它有难闻的气味。
更多信息:
- 那些字符串从外部进入程序(file/user 输入)。
- Extracted/parsed 值应该绑定到某些东西(例如哈希 table)以便进一步访问。
你说得对 - 从字符串评估代码是一种糟糕的代码味道......也许有更好的方法来完成你想要完成的事情。无论如何,这是一个可能的解决方案:
(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>