kann ich viele Variablen zusammen wie folgt definieren:Neudefinition eine Liste von Variablen in Racket
(match-define (list a b c) (list 1 2 3))
a
b
c
Ausgang:
1
2
3
>
Aber wie kann ich diese Variablen wieder später im Programm neu zu definieren?
Im Wesentlichen bin ich auf der Suche nach einer "Match-Redefine" -Funktion oder Makro.
Nach nicht funktioniert:
(set! (list a b c) (list 10 20 30))
set!: not an identifier in: (list a b c)
ich auch versucht Kartenfunktion:
> (map set! (list a b c) (list 5 6 7))
. set!: bad syntax in: set!
>
Muss ich eine Funktion für sie schreiben oder gibt es eine einfache integrierte Methode?
Edit: Ich habe versucht, folgende Match-umdefinieren Makro, auf https://docs.racket-lang.org/guide/pattern-macros.html auf den Linien von Swap-Makro geschrieben:
(match-define (list a b c) (list 1 2 3))
(println "------- sl --------")
(define sl (list a b c))
(println sl)
(println "------- vl --------")
(define vl (list 5 6 7))
(println vl)
(define-syntax-rule (match-redefine slist vlist)
(for ((i slist) (j vlist))
(set! i j)
)
)
(println "----- expecting sl to become 5 6 7 ----------")
(match-redefine sl vl)
(println sl)
Aber es funktioniert nicht. Die Ausgabe lautet:
"------- sl --------"
'(1 2 3)
"------- vl --------"
'(5 6 7)
"----- expecting sl to become 5 6 7 ----------"
'(1 2 3)
Edit: Ich fand, dass Spiel-let erlaubt Neuzuteilung mit Listen:
(define a 1)
(define b 2)
(define c 3)
(match-let (( (list a b c) (list 100 200 300) ))
(println a)
(println b)
(println c)
)
Ausgang:
100
200
300
Aber es ist kein 'definieren' oder " einstellen!' zur Verwendung über die gesamte verbleibende Quelldatei.
Können wir das nicht mit einem Makro tun? Wie funktioniert Tausch auf dieser Seite https://docs.racket-lang.org/guide/pattern-macros.html? – rnso
Vielleicht eine neue Frage, in der Sie das größere Bild erklären? – soegaard
Makros wie 'swap' können funktionieren, weil Makros nicht mit Werten umgehen, sondern mit Syntax umgehen. Formen wie 'set!' Behandeln auch keine Werte und auch keine Makros wie 'match-define'. Das '(list a b c)' in einem 'match-define' Formular ist kein Wert. Um 'match-define' zu definieren, ist es ein Stück Syntax, das zufällig aussieht wie ein' list' Funktionsaufruf. –