Как оценить случай cond и вернуть объект функции?

Получил TypeError: Не знаю, как обернуть : . в 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]?

1 ответ

Решение

Чтобы eval HyExpression сначала он должен быть скомпилирован в Python ast. Пока вы можете положить произвольные объекты в HyExpression, это не значит, что вы можете скомпилировать его. (Было немного разговоров об имитации этой функции, но в настоящее время она недоступна.)

Компилятор Hy может делать это только для определенного набора типов данных, называемых типами Hy Model, или для нескольких других типов, которые могут автоматически преобразовываться в эти модели 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>
Другие вопросы по тегам