我正在尝试从 Hy 生成一些 python 代码。怎么做得更好?
我尝试了几种方法。一个是宏:
(defmacro make-vars [data]
(setv res '())
(for [element data]
(setv varname (HySymbol (+ "var" (str element))))
(setv res (cons `(setv ~varname 0) res)))
`(do ~@res))
然后在捕获宏扩展后,我打印代码的 python 反汇编。
但是,似乎使用宏我无法传递变量,因此:
(setv vnames [1 2 3])
(make-vars vnames)
定义varv
, varn
,vara
等等,而不是var1
, var2
, var3
. 似乎可以通过以下方式进行正确的调用:
(macroexpand `(make-vars ~vnames))
但这似乎过于复杂。
我遇到的另一个问题是 的必要性HySymbol
,这是一个很大的惊喜。但是当我尝试第二种方法时,我真的受到了伤害,我创建了一个返回引用形式的函数:
(defn make-faction-detaches [faction metadata unit-types]
(let [meta-base (get metadata "Base")
meta-pattern (get metadata "Sections")
class-cand []
class-def '()
class-grouping (dict)]
(for [(, sec-name sec-flag) (.iteritems meta-pattern)]
;; if section flag is set but no unit types with the section are found, break and return nothing
(print "checking" sec-name)
(if-not (or (not sec-flag) (any (genexpr (in sec-name (. ut roles)) [ut unit-types])))
(break)
;; save unit types for section
(do
(print "match for section" sec-name)
(setv sec-grouping (list-comp ut [ut unit-types]
(in sec-name (. ut roles))))
(print (len sec-grouping) "types found for section" sec-name)
(when sec-grouping
(assoc class-grouping sec-name sec-grouping))))
;; in case we finished the cycle
(else
(do
(def
class-name (.format "{}_{}" (. meta-base __name__) (fix-faction-string faction))
army-id (.format "{}_{}" (. meta-base army_id) (fix-faction-string faction))
army-name (.format "{} ({})" (fix-faction-name faction) (. meta-base army_name)))
(print "Class name is" class-name)
(print "Army id is" army-id)
(print "Army name is" army-name)
(setv class-cand [(HySymbol class-name)])
(setv class-def [`(defclass ~(HySymbol class-name) [~(HySymbol (. meta-base __name__))]
[army_name ~(HyString army-name)
faction ~(HyString faction)
army_id ~(HyString army-id)]
(defn --init-- [self]
(.--init-- (super) ~(HyDict (interleave (genexpr (HyString k) [k class-grouping])
(cycle [(HyInteger 1)]))))
~@(map (fn [key]
`(.add-classes (. self ~(HySymbol key))
~(HyList (genexpr (HySymbol (. ut __name__))
[ut (get class-grouping key)]))))
class-grouping)))]))))
(, class-def class-cand)))
该函数采用在 python 中如下所示的元数据:
metadata = [
{'Base': DetachPatrol,
'Sections': {'hq': True, 'elite': False,
'troops': True, 'fast': False,
'heavy': False, 'fliers': False,
'transports': False}}]
并获取具有以下形式的类列表:
class SomeSection(object):
roles = ['hq']
它需要大量使用 hy 的内部类,而我无法正确表示 True 和 False,而是求助于HyInteger(1)
and 。HyInteger(0)
为了从此函数中获取 python 代码,我通过disassemble
.
总结一下:
- 从 Hy 生成 python 代码的最佳方法是什么?
- True 和 False 的内部表示是什么?
- 可以调用一个处理其参数并从宏返回带引号的 Hy 形式的函数吗?如何?