zuerst ein paar Anmerkungen:
(define f (lambda (x) l))
ist die gleiche wie
(define (f x) l))
aber Sie sind aber auch mit Hilfe
(define (board) (lambda (matrix) l))
, welche die gleiche ist wie
(define board (lambda() (lambda (matrix) l)))
Die Unterscheidung ist wichtig, . Die ersten beiden, die ich aufgelistet habe, binden f an eine Funktion, die einen Parameter annimmt und l zurückgibt. Ich schätze, das ist was du machen willst. In den zweiten beiden binden Sie die Karte an eine Funktion, die keine Parameter akzeptiert und eine Funktion zurückgibt, die 1 Parameter, Matrix, annimmt (mit der sie anscheinend nichts zu tun hat) und gibt ein l zurück.
zweite Ausgabe, (list ((b w....) ...))
wird nicht funktionieren, weil es versuchen wird, (b w ...)
auszuwerten. Sie müssen Liste in der Funktion Anwendungsposition für jede Zeile Ihres Boards wie (list (list b w ...) (list w b ...) ...)
haben, damit Sie Code sogar kompilieren.
Auf zu Ihrer Frage. link-ref ist in "racket/base" enthalten und wird zum Referenzieren von Elementen in einer Liste verwendet, wenn Sie den Index in der Liste kennen.
(Liste-Ref 2 (Liste 'a' b 'c' d))
wird zurückgeben 'c. Der Index beginnt bei 0. Da Sie eine Liste mit Listen haben, müssen Sie list-ref zweimal anwenden, um ein "b" oder "w" zu erhalten.
Um es zu ändern, gut, können Sie nicht. Seit r6rs sind Paare (die Make-up-Listen) unveränderlich. Die empfohlene Vorgehensweise ist, wenn möglich, eine neue Liste mit Ihrer Änderung zurückzugeben. Sie können diese etwas ineffiziente Version von list-set
verwenden, die eine Kopie der Liste mit Ihrem neuen Wert an einem Index zurückgibt. jedoch
(define (list-set lis idx val)
(map (lambda (e i)
(if (= i idx) val e))
lis
(iota (length lis))))
In diesem Fall würde ich empfehlen, auf eine andere Datenstruktur besser geeignet, um die Aufgabe zur Hand Schale da Sie wahrscheinlich O (1) Zugriff auf die Elemente in der Platte wollen. Schauen Sie sich vectors an, die sich ähnlich wie Listen verhalten, aber für ständige Suchvorgänge und Aktualisierungen verwendet werden. Es gibt eine eingebaute vector-ref
und vector-set!
Operationen, die Sie anstelle meiner obigen Funktion verwenden sollten.
Incase ist dies Teil eines größeren Problem und Sie sind bereits überall Listen verwenden, können Sie die vector->list
und list->vector
Funktionen hin und her gehen. Sie können auch verwenden, aber nicht.
Besser noch ist die multidimensionale Array-Bibliothek in srfi/25 angeboten, aber das könnte komplizierter sein, die Sie erhalten möchten.
Der zweite Teil Ihrer Frage war, wie Sie die Platine rekursiv aufbauen. Nun, hier ist eine Version mit Karte.
(require (lib "1.ss" "srfi"))
(define (board)
(map (lambda (x)
(map (lambda (y)
(if (odd? (+ x y)) b w))
(iota 8)))
(iota 8)))
und hier ist eine rekursive Version
(define (board)
(letrec ((board-helper
(lambda (x)
(if (eq? x 8) '()
(cons (row-helper x 0) (board-helper (+ 1 x))))))
(row-helper
(lambda (x y)
(if (eq? y 8) '()
(cons (if (odd? (+ x y)) b w) (row-helper x (+ 1 y)))))))
(board-helper 0)))
Dank! Das war genau das, was ich brauchte, die beiden Versionen, die Karte mit der Karte ist effizienter? Ich versuche ein konane Spiel zu machen ... das war das Brett, und als nächstes mache ich einen automatischen Computerspieler. Ich habe nicht viel Wissen über Schema, also ist es schwierig. Nun, Sie haben mir viel geholfen, vor allem um zu verstehen, wie ich zu dem Problem komme. Nochmals vielen Dank und ein frohes neues Jahr! – gn66