我无法在没有缩进的情况下向 Python 提交多行 Hy:
import hy
expr=hy.read_str("(+ 1 1)(+ 2 2)")
hy.eval(expr)
=> 2
第二个 '(+ 2 2)' 语句显然被忽略了。
显然 Python 存在的理由是缩进,当然,“Hy 风格指南”显示所有内容都是不断缩进的,并且也有这样的说法:
“新行必须始终缩进超过其父左括号。”
那么有没有办法避免在 Hy 中缩进并通过hy.eval(expr)提交单个非缩进字符串?
我无法在没有缩进的情况下向 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
是问题 #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 形式解析为非常小的“无”)。所以一个人可以用一个“最后一个”语句来包装所有东西:
hy.eval(hy.read_str( "(last [(+ 1 1) (+ 2 2) (+ 3 3)] )" ))
-> 6
可能最好的解决方案是按照Kodiologist 的说明使用do:
hy.eval(hy.read_str( "(do (+ 1 1) (+ 2 2) (+ 3 3) )" ))
-> 6