将《小阴谋家》中的 Q 和 P 函数翻译成 Common Lisp?
在《小计划者》的第 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 ))))))
(免责声明 - 这不是家庭作业问题 - 这是为了我的理解和学习)
In Chapter 9 of the Little Schemer, the Author presents the following two functions
(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)))))))
and proposes that they are evaluated with the following execution:
(frontier (P (second$ (second$ int))) 10)
How would you write the P and Q functions in Common Lisp?
(I have translated the Y-Combinator myself - but I'm finding this one challenging)
--Helper Functions--
(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 ))))))
(Disclaimer - This Is Not A Homework Question - it is for my understanding and learning)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我假设:
考虑到这一点,Scheme 到 Common Lisp 的直接翻译给出:
Whose last line返回:
这是一个众所周知的系列,所以我认为翻译是成功的:-)
I assumed:
With this in mind, the direct translation of Scheme into Common Lisp gives:
Whose last line returns:
which is a well known series, so I assume the translation is successful :-)