Nie dostaję tej pierwszej/ostatniej rzeczy w Common-Lisp. Tak, widzę, jak to działa, ale nie rozumiem DLACZEGO działa w ten sposób.Common Lisp: pierwsza zwraca najpierw, ale ostatnia zwraca listę ostatnich - huh?
Zasadniczo, aby uzyskać pierwszy element na liście, mogę użyć (first mylist)
. Jednakże, jeśli chcę ostatni przedmiot, (last mylist)
nie daje mi tego; zamiast tego daje mi listę zawierającą ostatni element na mojej liście!
(Używam Clozure-CL, który ma kilka innych dziwactw, które wydają mi się błędami, ale ponieważ jestem Lisp-n00b, staram się nie wpaść na starego "tłumacza jest „trick :))
Tak więc, na przykład złamana!
? (setq x '((1 2) (a b)))
=> ((1 2) (A B))
? (first x)
=> (1 2) ; as expected
? (last x)
=> ((A B)) ; why a list with my answer in it?!
? (first (last x))
=> '(A B) ; This is the answer I'd expect from plain-old (last x)
Czy ktoś może mi pomóc zrozumieć, dlaczego ten ostatni robi? Czy używam tych elementów nieprawidłowo? Czy naprawdę dziwna kula to first
?!
Dzięki!
Doing '(' (1 2) '(a b)) nie jest tym, co faktycznie masz na myśli, tak myślę. Zamiast tego użyj "((1 2) (a b)). To, co napisałeś, tworzy następującą listę: ((quote (1 2)) (quote (a b))). Tutaj dwa "cytaty" nie są interpretowane jako operator specjalny, który prawdopodobnie miałeś na myśli, ale po prostu stare symbole, które mają tę samą nazwę. Aby zobaczyć, co mam na myśli ocenić (pierwszy (pierwszy "(" (1 2) "(a b)))) w REPL. Powinno zwrócić wartość QUOTE. –
Thomas: masz rację. Źródło edytowane. – Olie