Hy代码是否需要缩进,就像Python一样?

Does Hy code require indenting, just like Python?

我无法在没有缩进的情况下向 Python 提交多行 Hy:

import hy
expr=hy.read_str("(+ 1 1)(+ 2 2)")
hy.eval(expr)
=> 2

第二个“(+ 2 2)”语句显然已被忽略。

显然 Python 存在的理由是缩进,当然“Hy Style Guide”显示所有内容都不断缩进,并且还有这样的说法:

"New lines must ALWAYS be indented past their parent opening bracket."

那么有没有办法避免 Hy 中的缩进并通过 hy.eval(expr)?

提交单个非缩进字符串

Hy 是一种 free-form 语言,与大多数编程语言一样,但与 Python 不同。风格指南只是一个风格指南。

您在 read-str 中看到的是 issue #1591。使用 do 将多个表达式合并为一个。

不,Hy 中不需要缩进,并且(如 Kodiologist 所指出的那样)Hy 风格指南关于缩进的没完没了的喋喋不休实际上只是一个建议。

但是 Hy 没有任何类型的 'compound expression' 类型的表单,向 Hy 提交一系列的多个语句确实需要额外的技巧。

将多个语句(又名 'forms')作为一个序列提交的明显解决方案不起作用:

hy.eval(hy.read_str( "((+ 1 1) (+ 2 2))" ))
-> TypeError: 'int' object is not callable

这当然是因为 Hy 试图 'call' 数字 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