Nie da się. Da się tylko rozszerzyć istniejące specjalizery na equal/equalp/inny, korzystając z ogromnych możliwości
MOP. Nie można natomiast zaimplementować guardów:
fun x | x < 1 = ..
fun x | x > 25 = ..
fun x | x > 5 = ..
fun x = ..
A to niby dlaczego? Ja właśnie piszę pattern matcher. Mogę pokazać przykłady. Guardy jak najbardziej są.
- Nie wszystkie języki funkcyjne mają poszczególne patterny jako osobne definicje funkcji, można też zawrzeć wszystkie wzory w jednym miejscu.
- Nawet jak miałyby być osobno, co za problem?
(defclass my-fn ()
()
(:metaclass closer-mop:funcallable-standard-class))
==> #<SB-MOP:FUNCALLABLE-STANDARD-CLASS MY-FN>
(defmethod initialize-instance :after ((obj my-fn) &key fn)
(check-type fn function)
(closer-mop:set-funcallable-instance-function obj fn))
==> #<STANDARD-METHOD INITIALIZE-INSTANCE :AFTER (MY-FN) {BBDA271}>
(setf (symbol-function 'foo)
(make-instance 'my-fn :fn (constantly "oh hi")))
==> #<MY-FN {B62F765}>
(foo)
==> "oh hi"
Skoro da się uczynić obiekt funkcją to da się w nim trzymać patterny :)
Nie za bardzo, trzebaby też zmienić każde odwołanie do zmiennej na wywołanie funkcji. Można leniwość zemulować w
znacznym zakresie i tyle.
Nie trzeba, pobranie wartości zmiennej nie ma efektów ubocznych. Niby są makra symboli, ale pierwsze co code walker robi to rozszerzenie makr.
Kiedyś napisałem code walkerem leniwość, testowałem go na jakichś przykładach z wikipedii i działało bez problemu.
W CLu każdy typ danych +JEST+ obiektem... (i to nawet dosłownie ;) Wszystko jest obiektem, nawet zwykła funkcja/
metoda ;)
Nie, fixnum to po prostu (na sbclu pod IA-32) 3 bity taga i 29 bitów 'signed int'. Obiekt to wskaźnik do klasy i wektor wartości slotów. Niby CLASS-OF działa na wszystkim ale to ściema, po prostu ma special-case na wbudowane typy. Nawet prototypy klas są, typu #:mu dla symboli czy 42 dla intów :)
A wymuszenie włożenia obiektu ;) do rejestru wymaga specjalnej deklaracji, którą OBIECUJESZ kompilatorowi że typ
będzie taki a taki i że ma to założyć z góry.
Chyba w jakichś obiektowych dynamicznie typowanych językach :) FIXNUM to zawsze word i tyle, co najwyżej floaty mogą być boksowane...
EDIT:
Dlaczego wszyscy mylą pattern matching z specjalizatorami w CLOS-ie? Pattern matching wcale nie musi być napisany na CLOS-ie, zresztą wtedy trzeba by było przepisać spory kawał MOP-a, łącznie z memoizacją. Zresztą, można zrobić fajne słowa kluczowe do wzorów nie mające nic wspólnego z typami, np. domknięcie Kleene'a albo destrukturyzację list.