문제

Little Schemer의 9 장에서 저자는 다음 두 기능을 제시합니다.

(define Q 
  (lambda (str n) 
    (cond 
      ((zero? (remainder (first$ str ) n)) 
        (Q (second$ str ) n)) 
      (t (build (first$ str ) 
        (lambda ( ) 
          (Q (second$ str ) n))))))) 

(define P
  (lambda (str)
    (build (first$ str)(lambda () (P (Q str (first$ str)))))))

다음과 같은 실행으로 평가된다고 제안합니다.

(frontier (P (second$ (second$ int)))  10)

Common LISP에서 P 및 Q 기능을 어떻게 작성 하시겠습니까?

(나는 y -combinator를 직접 번역했다. 그러나 나는 이것을 도전하고있다)

-헬퍼 함수-

(define frontier
  (lambda (str n)
    (cond
      ((zero? n) (quote ()))
        (t (cons (first$ str) (frontier (second$ str) (sub1 n)))))))

(define str-maker
  (lambda (next n)
    (build n (lambda () (str-maker next (next n))))))

(define int (str-maker add1 0))

(define second$
  (lambda (str)
    ((second str))))

(define first$ first)

(define build
  (lambda (a1 a2)
    (cond
      (t (cons a1
        (cons a2 (quote ())))))))))

(define first
  (lambda (p)
    (cond
       (t (car p)))))

(define second
  (lambda (p)
    (cond
      (t (car (cdr p))))))

(define add1 
  (lambda (n)
    (+ 1 n)))

(define remainder 
  (lambda  (n m)
    (cond
      (t (- n (* m (/ n m ))))))

(면책 조항 - 이것은 숙제가 아닙니다 - 그것은 나의 이해와 학습을위한 것입니다)

도움이 되었습니까?

해결책

나는 가정했습니다:

  • p 정의에서 "(q (str (str (first $ str)))"당신은 "(q str (first $ str))"(q가 2 ratment 함수이기 때문에 : "(q str (first $ str))를 의미합니다.
  • 짓다 First $ 및 두 번째 $ 작업을 만드는 헬퍼입니다. 목록

이를 염두에두고 체계를 일반적인 LISP로 직접 번역하면 다음과 같습니다.

(defun first$ (list) (first list))
(defun second$ (list) (funcall (second list)))
(defun build (a b) (list a b))

(defun frontier (str n)
  (if (zerop N)
    ()
    (cons (first$ str) (frontier (second$ str) (1- n)))))

(defun str-maker (next n)
  (list n (lambda () (str-maker next (funcall next n)))))

(setq int-maker (str-maker #'1+ 0))

(defun Q (str n)
  (if (zerop (rem (first$ str) n))
    (Q (second$ str) n)
    (list (first$ str) (lambda () (Q (second$ str) n)))))

(defun P (str)
  (list (first$ str) (lambda () (P (Q str (first$ str))))))

(frontier (P (second$ (second$ int-maker))) 10)

마지막 줄이 반환됩니다.

(2 3 5 7 11 13 17 19 23 29)

잘 알려진 시리즈이므로 번역이 성공했다고 가정합니다 :-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top