Hy代码像Python一样需要缩进吗?

问题描述

没有缩进,我无法向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