问题描述
没有缩进,我无法向Python提交多行Hy:
import hy
expr=hy.read_str("(+ 1 1)(+ 2 2)")
hy.eval(expr)
=> 2
第二个'(+ 2 2)'语句显然已被忽略。
很明显,Python的存在理由是缩进,当然,“ Hy风格指南”显示了不断缩进的所有内容,并且也要这样说:
“新行必须始终缩进其父开头的括号内。”
那么有没有办法避免在Hy中缩进并通过 hy.eval(expr)提交单个非缩进字符串?
解决方法
Hy是一种自由格式的语言,与大多数编程语言一样,与Python不同。样式指南只是样式指南。
您在read-str
上看到的是issue #1591。使用do
将多个表达式组合成一个表达式。
不,Hy不需要缩进,并且(如 Kodiologist 所述),《 Hy风格指南》对缩进的无休止的追求确实应该是一个建议。
然而,Hy没有任何形式的“复合表达式”类型,并且向Hy提交一系列的多个语句确实需要其他技巧。
一种明显的解决方案是使序列提交多个语句(也称为“表单”)不起作用:
hy.eval(hy.read_str( "((+ 1 1) (+ 2 2))" ))
-> TypeError: 'int' object is not callable
发生这种情况当然是因为Hy试图将数字2作为数字4的函数“调用”。
一个人可以在列表中收集表格序列。但这捕获了它们的所有输出:
hy.eval(hy.read_str( "[(+ 1 1) (+ 2 2)]" ))
-> [ 2 4 ]
自然地,对于一个具有许多步骤的大型计算而言,最终可能会产生一个不需要的垃圾列表,从而浪费内存。 (但是,大多数Hy形式解析为“ None”,这很小)。因此,只需用“ last”语句包装所有内容即可:
hy.eval(hy.read_str( "(last [(+ 1 1) (+ 2 2) (+ 3 3)] )" ))
-> 6
也许最好的解决方案是使用 do 作为 Kodiologist 注释:
hy.eval(hy.read_str( "(do (+ 1 1) (+ 2 2) (+ 3 3) )" ))
-> 6