كيف يمكنني جعل أرقام الكنيسة أكثر قابلية للقراءة في Lisp؟

StackOverflow https://stackoverflow.com/questions/2675566

سؤال

يمكنني تحديد أرقام الكنيسة سهلة إلى حد ما باستخدام المخطط:

> (define f (lambda (x) x))
> (f f) ;0
#<procedure:f>
> (f (f f)) ;1
#<procedure:f>

ومع ذلك ، هذا لا يجعل من السهل للغاية التعرف على ذلك (f f) هل 0 و (F (FF)) هو 1. هل هناك طريقة يمكنني من خلالها جعل هذه الأرقام أكثر قابلية للقراءة؟ ما سيكون مثاليًا هو:

> (f f)
0
> (f (f f))
1

المثال في المخطط ، لكنني سأخذ إجابة في أي lisp.

هل كانت مفيدة؟

المحلول

أولاً ، دعونا نحدد أرقام الكنيسة الحقيقية التي لها خاصية مرغوبة 0 != 1:

(define zero (lambda (f x) x))
(define (succ cn) (lambda (f x) (f (cn f x))))

لذا zero هل تمثيل الكنيسة لـ 0 ، (succ zero) من 1 ، (succ (succ zero)) من 2 وهلم جرا.

الآن نظرًا لأن هذه الوظائف مجرد وظائف ، فلا توجد طريقة لإخبار Repl لعرضها كأرقام ، ولكن يمكنك تحديد وظيفة cn إلى int التي تحول numerals إلى ints والتي يمكن بعد ذلك عرضها بشكل طبيعي:

> (define (cn-to-int cn) (cn (lambda (x) (+ x 1)) 0))
> (cn-to-int zero)
0
> (cn-to-int (succ zero))
1
> (cn-to-int (succ (succ zero)))
2
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top