簡體   English   中英

使用 Hylang 的 Python 中的遞歸錯誤

[英]RecursionError in Python Using Hylang

首先讓我說我知道我在做什么並不理想,但我正在嘗試寫成員? 來自The Little Schemer 的function 使用 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 文檔中它甚至說有一個默認的遞歸限制來防止 Z0D61F8370CAD1D412F80B84D143E12 堆棧溢出。 在我的機器上getrecursionlimit()產生的值是 1000,並且我能夠成功地將其設置為超過 20,000,然后才出現段錯誤。 即使將其設置為 20,000,我仍然會在 5 個元素的列表中收到錯誤消息。 我不明白的是......我如何在一個 5 元素列表上達到 20,000 多個遞歸級別?

對於那些好奇的人,我正在使用 Python 3.6.5、MacOS Mojave 版本 10.14.6 在 15" Macbook pro、Hylang 版本 0.18.0 和 output 上使用 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)])))

我無法在 Hy master 上重現這一點。 這可能是自 0.18.0 以來修復的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM