Deutschsprachiges LilyPond Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: Köbi am Mittwoch, 4. September 2019, 19:29

Titel: alist an Funktion übergeben
Beitrag von: Köbi am Mittwoch, 4. September 2019, 19:29
Liebe scheme-Profis

Ich scheitere wieder einmal an etwas banalem:

\version "2.19.83"

myKey = "k1"

FuncA =
#(define-void-function
  (aList)
  (list?)
  (cdr (assoc myKey aList))
)

lA = #'(("k1" . "v1") ("k2" . "v2"))
\FuncA \lA  % geht

lB = #'((myKey . "v1") ("k2" . "v2"))
\FuncA \lB  % geht nicht

Warum funktioniert der zweite Aufruf nicht? Wie bringe myKey in die alist, so dass cdr dann funktioniert?

Ich schätze, es hat etwas dem Hochkomma beim Bilden der alist zu tun, aber was?

Wie immer Danke im Voraus und schöne Grüsse aus der CH
Köbi
Titel: Antw:alist an Funktion übergeben
Beitrag von: harm6 am Mittwoch, 4. September 2019, 22:00
Hi,

schau Dir an was Du geschrieben hast:

myKey = "k1"
lB = #'((myKey . "v1") ("k2" . "v2"))
\void \displayScheme \lB

=>

(list (cons (quote myKey) "v1") (cons "k2" "v2"))

myKey ist also ein symbol und hat nichts mit der Definition gleichen Namens zu tun, es wird nicht evaluiert.

Siehe auch meinen Beitrag:
https://archiv.lilypondforum.de/index.php/topic,1762.msg9753.html#msg9753 (https://archiv.lilypondforum.de/index.php/topic,1762.msg9753.html#msg9753)

Deshalb:

myKey = "k1"
lBh = #`((,myKey . "v1") ("k2" . "v2"))
\void \displayScheme \lBh

=>

(list (cons "k1" "v1") (cons "k2" "v2"))


Gruß,
  Harm

Titel: Antw:alist an Funktion übergeben
Beitrag von: Köbi am Donnerstag, 5. September 2019, 08:13
Hallo Harm

Vielen Dank! Den verlinkten Artikel habe ich zwar mal gelesen, aber dass das jetzt meinen Fall betrifft, darauf wäre ich natürlich nicht gekommen...

Nun stehe ich schon an der nächsten Stelle an. Wie kann ich in einer alist eine andere alist als value einfügen?


\version "2.19.83"

myKey = "k1"

FuncA =
#(define-void-function
  (aList)
  (list?)
  (cdr (assoc myKey aList))
)

lA = #'(("k1" . "v1") ("k2" . "v2"))
% \void \displayScheme \lA

lB = #`((,myKey . "v3") ("k4" . "v4"))
% \void \displayScheme \lB

lC = #`((,myKey . "v3") ("k4" . ,lA))
\void \displayScheme \lC


=>

(list (cons "k1" "v3")
      (list "k4" (cons "k1" "v1") (cons "k2" "v2")))

kommt dabei raus. Es müsste aber

(list (cons "k1" "v3")
      (cons "k4" (list (cons "k1" "v1") (cons "k2" "v2"))))

sein (schätze ich mal).

Gruss, Köbi
Titel: Antw:alist an Funktion übergeben
Beitrag von: harm6 am Donnerstag, 5. September 2019, 09:48
Zitat
(list (cons "k1" "v3")
      (list "k4" (cons "k1" "v1") (cons "k2" "v2")))

kommt dabei raus. Es müsste aber

(list (cons "k1" "v3")
      (cons "k4" (list (cons "k1" "v1") (cons "k2" "v2"))))

Das ist dasselbe:

\void \displayScheme
#(equal?
(list (cons "k1" "v3")
       (list "k4" (cons "k1" "v1") (cons "k2" "v2")))
(list (cons "k1" "v3")
       (cons "k4" (list (cons "k1" "v1") (cons "k2" "v2")))))

=>
#t

Worauf willst Du hinaus?

Gruß,
  Harm