Wie kann ich in Lisp menschlichere Kirche Zeichen lesbar?
-
28-09-2019 - |
Frage
kann ich Kirche Ziffern definieren ziemlich einfach Schema verwendet:
> (define f (lambda (x) x))
> (f f) ;0
#<procedure:f>
> (f (f f)) ;1
#<procedure:f>
Dies ist jedoch es nicht leicht, sehr zu erkennen, dass (f f)
0 und (f (f f)) ist 1. Gibt es eine Möglichkeit, dass ich diese Ziffern besser lesbar machen? Was wäre ideal, ist dies:
> (f f)
0
> (f (f f))
1
Das Beispiel in Schema ist, aber ich werde eine Antwort auf jedem Lisp nehmen.
Lösung
Lassen Sie uns zunächst reale Kirche Zeichen definieren, die die wünschenswerte Eigenschaft, dass 0 != 1
haben:
(define zero (lambda (f x) x))
(define (succ cn) (lambda (f x) (f (cn f x))))
So zero
ist die Kirche Darstellung von 0, (succ zero)
von 1, (succ (succ zero))
von 2 und so weiter.
Da nun die, die gerade Funktionen sind, gibt es keine Möglichkeit, die repl zu sagen, sie als Zahlen angezeigt werden, aber Sie können eine Funktion cn-to-int definieren, die Kirchenzeichen Ints umwandelt, die dann normalerweise angezeigt werden kann:
> (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