0

首先让我说我知道我在做什么并不理想,但我正在尝试写成员?The Little Schemer使用 Hy的函数。

(setv else True)

(defn null? [lst]
  " If list is empty return True else False "
  (if lst
      False
      True))


(defn member? [a lat]
  " Checks if value is a member of a list "
  (cond
    [(null? lat) False]
    [else (or (= (first lat) a)
              (member? a (rest lat)))]))

(print (member? 1 '(2 3 4 1)))

这完全符合我的预期。问题是,如果列表长度大于 4 个元素,我会收到错误消息

RecursionError: maximum recursion depth exceeded while calling a Python object

我知道 Python 并不打算进行递归,并且在Python 文档中它甚至说有一个默认的递归限制来防止 C 堆栈溢出。在我的机器上getrecursionlimit()产生 1000 的值,并且我能够成功地将其设置为超过 20,000,然后才出现段错误。即使将其设置为 20,000,我仍然会在 5 个元素的列表中收到错误消息。我不明白的是......我如何在一个 5 元素列表上达到 20,000 多个递归级别?

对于那些好奇的人,我在 15" Macbook pro 上使用 Python 3.6.5、MacOS Mojave 版本 10.14.6、Hylang 版本 0.18.0,而我使用 hy2py 的程序的输出是

from hy.core.language import first, rest
from hy import HyExpression, HyInteger
hyx_else = True


def is_null(lst):
    """ If list is empty return True else False """
    return False if lst else True


def is_member(a, lat):
    """ Checks if value is a member of a list """
    return False if is_null(lat) else first(lat) == a or is_member(a, rest(lat)
        ) if hyx_else else None


print(is_member(1, HyExpression([] + [HyInteger(2)] + [HyInteger(3)] + [
    HyInteger(4)] + [HyInteger(5)] + [HyInteger(1)])))
4

1 回答 1

-1

我无法在 Hy master 上重现这一点。这可能是自 0.18.0 以来修复的错误。

于 2020-05-29T00:47:54.760 回答