سؤال

في الفصل 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)

كيف تكتب وظائف P و Q في LISP المشترك؟

(لقد ترجمت Y-CARMINATOR بنفسي - لكنني أجد تحديا واحدا)

- وظائف - Helper -

(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 (Str ($ Str)
  • يبني هو مساعد يخلق شيئا ما تقريبا العمل $ والثانية $: قائمة

مع مراعاة ذلك، يعطي الترجمة المباشرة للمخطط إلى 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