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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top