1

得到 TypeError: Don't know how to wrap <class 'function'>: <function test_cond_list_fn.<locals>.<lambda> at 0x000001B879FD3D08>

运行时

;a fn object
(setv a_fn (fn [x] (+ 1 x)))
;a mock predicator
(setv predicator True)
;inject predicator and a_fn into a (cond ..)
(setv cond_expr `(cond [(~predicator) [~a_fn]]))
;eval at another place 
(eval cond_expr)

如何创建“cond_expr”以获得结果 [a_fn] ?

4

1 回答 1

1

为了实现evalHyExpression必须首先编译成 Python ast。虽然您可以将任意对象放入 aHyExpression中,但这并不意味着您可以编译它。(关于模拟此功能的讨论已经很少,但目前不可用。)

Hy 编译器只能对称为 Hy 模型类型的特定数据类型集执行此操作,或者对可以自动转换为这些 Hy 模型的少数其他类型执行此操作。

在 Python ast 中没有明显的方法来表示函数对象,因此没有 Hy 模型。但是你可以编译一个函数定义

=> (setv a-fn '(fn [x] (+ 1 x)))
=> (setv cond-expr `(cond [True ~a-fn]))
=> (eval cond-expr)
<function <lambda> at 0x0000020635231598>

或函数的符号

=> (defn b-fn [x] (- x 1))
=> (setv cond-expr2 `(cond [True b-fn]))
=> (eval cond-expr)
<function <lambda> at 0x0000020635208378>
于 2018-08-03T16:02:12.033 回答