S Lispem nemam zadne prakticke zkusenosti. Proc ale musi byt zavedeny specialni formy? Pocitove mi tam nesedi. Neslo by specialni formu (IF PODMINKA fceTRUE fceFALSE) ji nahradit (IF PODMINKA '(fceTRUE fceFALSE)).
Proste by se fci IF predaly jako parametry vyhodnocena podminka a nevyhodnoceny seznam a az fce IF by z nej vyhodnotila prvni ci druhy prvek.
Aby to nemuselo byt v tom seznamu, musi to byt specialni forma (tudiz makro). Pokud by if byla takova funkce, jak navrhujete, musela by v tele obsahovat nejaky eval, takze by se problem jen dost neelegantne obesel. Lisp neni funkcionalni jazyk (a vyhodnocovaci proces neni liny), a proto se bez maker, ktere resi co se bude/nebude vyhodnocovat, neobejde.
Makro != speciální forma; popravdě řečeno to, že ve větě
3. seznamy jsou vyhodnocovány tak, že se první prvek seznamu chápe jako jméno funkce (či speciální formy), které je předán zbytek seznamu jako parametry této funkce (formy)
není zmínka o makrech mne docela překvapilo. Ale beru to tak, že mluví o již makroexpandovaném kódu a že o expanzi maker bude řeč jindy.
If opravdu jde lze udělat jako funkci a i bez evalu, volanou (if-fn cond #'true-branch #'false-branch) – ale všech forem se takto asi zbavit nelze, a tady zrovna přivolání vyleze function-value.
Mimochodem, historicky byl jako speciální funkce spíš
cond a if jako nadstavba, i když to CL nyní definuje obráceně – ale s „An implementation is free to implement a Common Lisp special operator as a macro. An implementation is free to implement any macro operator as a special operator, but only if an equivalent definition of the macro is also provided.“