RecursionError в Python с использованием Hylang - PullRequest
0 голосов
/ 29 мая 2020

Прежде всего позвольте мне сказать, что я знаю, что то, что я делаю, не идеально, но я пытаюсь написать члену? функция из 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 docs он даже говорит, что существует ограничение рекурсии по умолчанию, чтобы стек C не переполнялся. На моей машине getrecursionlimit() дает значение 1000, и я смог успешно установить его на более 20000, прежде чем получить segfault. Даже если он установлен на 20000, я все еще получаю ошибку в списке из 5 элементов. Я не понимаю ... Как я могу достичь более 20 000 уровней рекурсии в списке из 5 элементов?

А для любопытных я использую Python 3.6.5, MacOS Mojave версии 10.14 .6 на 15-дюймовом Macbook pro, 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)])))

1 Ответ

0 голосов
/ 29 мая 2020

Я не могу воспроизвести это на Хай мастере. Вероятно, это ошибка, которая была исправлена ​​с версии 0.18.0.

...