파이썬 방식으로 소수를 생성하려고합니다. 즉, 생성자를 사용하고 있습니다.Common Lisp에서 느리게 생성 프라임을 생성
파이썬 코드는 더 많거나 적은 내가 리스프에 아주 새로운 해요
def divisor_in_list(n, d):
""" Returns true if a divisor of n is in d, false otherwise"
def primes():
yield 2
primelist = [2]
i = 3
while True:
while divisor_in_list(i, primelist):
i += 2
primelist.append(i)
yield i
다음, 그래서 관용적 상응하는 것이 무엇인지 궁금 할 것이다. 이 시점에 내 연구의 최대 바탕으로, 나는 그것이 밖으로 뱉어 첫 번째 값이 나는하지 못하고, 불행하게도 3 점이다이 코드에 문제가있다,
(defun primes()
(let* ((p (list 2)) (n 3))
(lambda()
(loop while (divisor-in-slist n p)
do (incf n 2))
(nconc p (list n))
(+ n 0) ;; Not actually sure how to return N directly :(
)
)
)
그러나 다음과 같은 코드가 있습니다 그것을 우아하게 수정하여 첫 번째 값으로 2를 생성하는 방법을 알아 내야합니다.
람다에있는 if
문과 여분의 변수를 결합하여 메서드가 처음으로 호출되는지 여부를 확인할 수 있지만 추한 것처럼 보일 수 있습니다. 더 좋은 방법은 무엇입니까?
참고로 "게으른"키워드 => 게으른 라이브러리 : [clazy] (https://common-lisp.net/project/clazy/)의 – Ehvince
가능한 중복이 있습니까 파이썬의 생성기와 똑같은 간단한 lisp?] (https://stackoverflow.com/questions/32956033/is-there-a-straightforward-lisp-equivalent-of-pythons-generators) – coredump
추악한 사람은 보는 사람의 눈에 들어 있습니다. 파이썬 솔루션에서는 하드 코드 된 초기 수율 2, 알려진 코드의 하드 코딩 된 초기화 [2], 3에서 반복, 마지막으로 2 씩 증가하는 "치트"를 파이썬 솔루션에서 많이 볼 수 있습니다. 소수는 "2"라고 말하지 않고 3 등 간격으로 건너 뛰는 것으로 시작합니다. " 그래서 파이썬 솔루션은 구워진 소수 (primes)에 대해 우리가 알고있는 것에 대해 모든 종류의 속임수를 가지고 있습니다. "1보다 큰 정수, 두 개의 정수 요소가 1과 그 자체 만 있습니다"에서 다시 시도하십시오. 그럼 당신은 단지 하나의 못생긴 해킹이 필요합니다 :> 2로 건너 뜁니다. – kennytilton