Ich habe 2 Arten von Listen mit Schlüssel-Wert-Paaren suchen:Funktion von Werten in verschiedenen Arten von Listen
(define pairs1 (list (list 1 2)(list 10 20)(list 100 200)))
(define pairs2 (list (cons 1 2)(cons 10 20)(cons 100 200)))
Ich mag suche nach Wert in beiden Arten von Listen mit einer Funktion. Ich habe versucht, folgende (‚cdr‘ in ein und ‚zweite‘ in anderen fn), aber sie arbeiten mit einer Liste jeder:
(define (assoc_val1 val spair)
(for/list ((item spair) #:when (equal? (cdr item) val))
item))
(define (assoc_val2 val spair)
(for/list ((item spair) #:when (equal? (second item) val))
item))
Kann ich eine Funktion haben, die für beide Arten von Listen funktioniert? Gibt es auch eine gute Verbindung, die den Unterschied zwischen (Liste 1 2), (Nachteile 1 2) und (1 2) erklärt?
Edit: Ändern der Antwort von @Sylwester vorgesehen, Funktion können sich auf beiden Listen erkennen und Arbeit:
(define (assoc2* haystack needle [is-equal? equal?])
(if (list? (car haystack))
(findf (λ (e) (is-equal? needle (second e))) haystack)
(findf (λ (e) (is-equal? needle (cdr e))) haystack)
))
(assoc2* pairs1 20)
(assoc2* pairs2 20)
Ausgang:
'(10 20)
'(10 . 20)
Für Ihre letzte Frage: http://stackoverflow.com/questions/34984552/what-is-the-difference-between-quote-and-list – soegaard
Zum ersten: Warum möchten Sie zwei Arten von Schlüssel-Wert haben Darstellungen. Wähle eins. – soegaard
Danke für den Link, der hauptsächlich Listen- und Angebotsformulare behandelt. Irgendein Link für Liste gegen Nachteile Formen? Was ist der beste Weg, wenn man in einer Anwendung Schlüssel-Wert-Paare verwenden muss? – rnso