0

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

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

第二个 '(+ 2 2)' 语句显然被忽略了。

显然 Python 存在的理由是缩进,当然,“Hy 风格指南”显示所有内容都是不断缩进的,并且也有这样的说法:

“新行必须始终缩进超过其父左括号。”

那么有没有办法避免在 Hy 中缩进并通过hy.eval(expr)提交单个非缩进字符串?

4

2 回答 2

2

Hy 是一种自由形式的语言,与大多数编程语言一样,但与 Python 不同。样式指南只是样式指南。

您看到的read-str问题 #1591。用于do将多个表达式组合为一个。

于 2020-09-03T22:29:07.800 回答
0

不,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
于 2020-09-04T13:56:27.250 回答