alist an Funktion übergeben

Begonnen von Köbi, Mittwoch, 4. September 2019, 19:29

« vorheriges - nächstes »

Köbi

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

harm6

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

Deshalb:

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

=>

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


Gruß,
  Harm


Köbi

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

harm6

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