
Добавил:
Kaz
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
5.10. Ќ з «млҐ ўла ¦ҐЁп ¤«п ®ЇаҐ¤Ґ«ҐЁ©
Ќ з «млҐ ўла ¦ҐЁп ЁбЇ®«м§говбп ¤«п ¬ ЁЇг«Ёа®ў Ёп
®ЇаҐ¤Ґ«ҐЁп¬Ё дгЄжЁ©. Љ®Ј¤ дгЄжЁп ®ЇаҐ¤Ґ«пҐвбп, нв®
®ЇаҐ¤Ґ«ҐЁҐ ўв®¬ вЁзҐбЄЁ ЇбҐў¤®Є®¬ЇЁ«ЁагҐвбп ў бЁ«м® б¦ вго,
Є®¬Ї Євго д®а¬г - в Є §лў Ґ¬л© D-Є®¤.
ЋЎа вл© Їа®жҐбб ¤ҐЄ®¬ЇЁ«пжЁЁ ®ЇаҐ¤Ґ«ҐЁ© дгЄжЁ© ў
бўп§ л© бЇЁб®Є ®бгйҐбвў«пҐвбп ўв®¬ вЁзҐбЄЁ б ЁбЇ®«м§®ў ЁҐ¬
GETD ¤«п ў®ббв ®ў«ҐЁп ®ЇаҐ¤Ґ«ҐЁ©. ‘«Ґ¤®ў ⥫м®, Ё Є®¬ЇЁ«пжЁп,
Ё ¤ҐЄ®¬ЇЁ«пжЁп ҐўЁ¤Ё¬л ¤«п Ї®«м§®ў ⥫п.
GETD [svmbol,tvpe-only-flag] Function
…б«Ё <бЁ¬ў®«> Ґбвм дгЄжЁп, ®ЇаҐ¤Ґ«Ґ п Ї®«м§®ў ⥫Ґ¬,
(GETD бЁ¬ў®«) ¤ҐЄ®¬ЇЁ«ЁагҐв Ё ўл¤ Ґв ®ЇаҐ¤Ґ«ҐЁҐ <бЁ¬ў®« > ў
д®а¬Ґ бўп§ ®Ј® бЇЁбЄ . …б«Ё <бЁ¬ў®«> - Їа®бв п дгЄжЁп Ё«Ё
бЇҐжЁ «м п д®а¬ , (GETD бЁ¬ў®«) ў®§ўа й Ґв ¤аҐб ў дЁ§ЁзҐбЄ®©
Ї ¬пвЁ и Ў«® ¬ иЁ®¬ п§лЄҐ. …б«Ё <бЁ¬ў®«> Ґ пў«пҐвбп
бЇҐжЁ «м®© д®а¬®© Ё«Ё дгЄжЁҐ©, (GETD бЁ¬ў®«) ў®§ўа й Ґв NIL.
…б«Ё <д« Ј> Ґбвм Ґ NIL, (GETD бЁ¬ў®« д« Ј) ў®§ўа й Ґв
SPECIAL, Ґб«Ё <бЁ¬ў®«> пў«пҐвбп бЇҐжЁ «м®© д®а¬®©, LAMBDA, Ґб«Ё
<бЁ¬ў®«> пў«пҐвбп дгЄжЁҐ© ўлзЁб«ҐЁп, NLAMBDA, Ґб«Ё <бЁ¬ў®«> Ґ
пў«пҐвбп дгЄжЁҐ© ўлзЁб«ҐЁп, MACRO, Ґб«Ё <бЁ¬ў®«> пў«пҐвбп
¬ Єа®-дгЄжЁҐ©, Ё«Ё NIL, Ґб«Ё <бЁ¬ў®«> Ґ®ЇаҐ¤Ґ«Ґ.
ЏаЁ¬Ґа:
(DEFUN GETD (SYMBOL FLAG)
((NOT (SYMBOLP SYMBOL)) NIL)
((undefined SYMBOL) NIL)
((NULL FLAG)
((machine language routine SYMBOL)
(the memory address of the routine) )
(the S-expression equvalent of the D-code defining
the function SYMBOL) )
((special form SYMBOL) 'SPECIAL)
((eval function SYMBOL) 'LAMBDA)
((no-eval function SYMBOL) 'NLAMBDA)
((macro function SYMBOL) 'MACRO) )
PUTD [symbol,definition] Function
(PUTD бЁ¬ў®« ®ЇаҐ¤Ґ«ҐЁҐ) Є®¬ЇЁ«ЁагҐв <®ЇаҐ¤Ґ«ҐЁҐ> ў
D-Є®¤, ¬®¤ЁдЁжЁагҐв н«Ґ¬Ґв ®ЇаҐ¤Ґ«ҐЁп дгЄжЁЁ <бЁ¬ў®« >
гЄ § ЁҐ Є®¬ЇЁ«ЁагҐ¬л© D-Є®¤ Ё ў®§ўа й Ґв <бЁ¬ў®«>. ЋЎмҐЄвл,
Ґ пў«пойЁҐбп ⮬ ¬Ё (в.Ґ. Є®бв вл), ў ®ЇаҐ¤Ґ«ҐЁЁ дгЄжЁЁ Ґ
Є®¬ЇЁ«Їаговбп, ® ®бв овбп б®еа Ґл¬Ё Є Є бўп§ л© бЇЁб®Є.
‘«Ґ¤®ў ⥫м®, ў ®в«ЁзЁҐ ®в Ў®«ҐҐ а Ёе ўҐабЁ©, ЁвҐаЇаҐв в®а
muLISP-85 Ґ ¤®«¦Ґв ¤ҐЄ®¬ЇЁ«Ёа®ў вм в ЄЁҐ Є®бв вл Є ¦¤л© а §,
Є Є ®Ё ўбваҐз овбп, Ё Є®бв вл ¬®Јгв ᮤҐа¦ вм cons-л б
cdr-н«Ґ¬Ґв ¬Ё, пў«пойЁ¬Ёбп ҐNIL- ⮬ ¬Ё.
ЏҐаҐ¬Ґ п PUTD гЇа ў«пҐв б¦ вЁҐ¬ D-Є®¤ ў® ўаҐ¬п
Є®¬ЇЁ«пжЁЁ. ЏҐаҐ¬Ґ п MACROEXPAND гЇа ў«пҐв ¬ Єа®а биЁаҐЁҐ¬ ў®
ўаҐ¬п Є®¬ЇЁ«пжЁЁ.
„«п бўп§Ё б ®ЇаҐ¤Ґ«Ґл¬Ё Ї®«м§®ў ⥫Ґ¬ и Ў«® ¬Ё
¬ иЁ®¬ п§лЄҐ PUTD ўл§лў Ґвбп б <®ЇаҐ¤Ґ«ҐЁҐ¬>, а ўл¬ ¤аҐб ¬ ў
дЁ§ЁзҐбЄ®© Ї ¬пвЁ нвЁе и Ў«®®ў. „«п Ў®«ҐҐ ¤Ґв «м®Ј®
а бᬮваҐЁп Їа ўЁ« а Ў®вл б и Ў«® ¬Ё ¬ иЁ®¬ п§лЄҐ б¬.
Ј« ўг 7.
ЏаЁ¬Ґа:
(DEFUN PUTD (SYMBOL DEFN)
((OR (NOT (SYMBOLP SYMBOL)) (SYMBOLP DEFN)) NIL)
((NUMBER DEFN)
((AND (INTEGERP DEFN) (PLUSP DEFN))
(store DEFN in SYMBOL's function cell)
SYMBOL ) )
(compile DEFN into D-code)
(store a pointer to the D-code in SYMBOL's function cell)
SYMBOL )
(PUTD 'SQUARE '(LAMBDA (NUM) (*NUM NUM))) --> SQUARE
(SQUARE 5) --> 25
MOVD [symbol1,symbol2] Function
(MOVD бЁ¬ў®«1 бЁ¬ў®«2) ЇҐаҐ¤ Ґв ®ЇаҐ¤Ґ«ҐЁҐ дгЄжЁЁ ®в
<бЁ¬ў®« 1> Є <бЁ¬ў®«г2> Ё ў®§ўа й Ґв <бЁ¬ў®«2>. ‚ вҐе б«гз пе,
Є®Ј¤ ¤®бв в®з® дгЄжЁЁ MOVD, ® ¬®¦Ґв ЁбЇ®«м§®ў вмбп ў¬Ґбв®
Є®¬ЎЁ жЁЁ GETD-PUTD, в.Є. Ґ вॡгҐв ЇҐаҐЄ®¬ЇЁ«пжЁЁ.
Ќ ЇаЁ¬Ґа е Ї®Є § ®, Є Є ¬®¦® ЁбЇ®«м§®ў вм MOVD ¤«п
ЇаЁбў Ёў Ёп ¤агЈЁе ¬Ґ¬®ЁзҐбЄЁе Ё¬Ґ ҐЄ®в®ал¬ дгЄжЁп¬
ᥫҐЄв®а LISP ЎҐ§ гйҐаЎ ¤«п нд䥪⨢®бвЁ Ёе ўлЇ®«ҐЁп.
ЏаЁ¬Ґа:
(DEFUN MOVD (SYMBOL1 SYMBOL2)
((AND (SYMBOLP SYMBOL1) (SYMBOLP SYMBOL2))
(replace the contents of SYMBOL2's function cell with
the contents of SYMBOL1's function cell)
SYMBOL2 ) )
(MOVD 'CAR 'FIRST) --> FIRST
(MOVD 'CDR 'REST) --> REST
(MOVD 'CADR 'SECOND) --> SECOND
(MOVD 'CADDR 'THIRD) --> THIRD
(MOVD 'CADDDR 'FOURTH) --> FOURTH
(FIRST '(A B C D)) --> A
REMD [symbol] Function
(REMD бЁ¬ў®«) ¬®¤ЁдЁжЁагҐв н«Ґ¬Ґв ®ЇаҐ¤Ґ«ҐЁп дгЄжЁЁ
<бЁ¬ў®« >, ¤Ґ« п <бЁ¬ў®«> Ґ®ЇаҐ¤Ґ«Ґл¬. REMD ў®§ўа й Ґв
<бЁ¬ў®«>. ’.Є. бЁ¬ў®«л, Ґб«Ё ®Ё, Ї®¬Ё¬® ўбҐЈ® Їа®зҐЈ®,
Ґ®ЇаҐ¤Ґ«Ґл, ¬®Јгв Ўлвм ўлЎа л в®«мЄ® бЎ®айЁЄ®¬ ¬гб®а , REMD
з бв® ЁбЇ®«м§гов ¤«п нвЁе 楫Ґ©.
ЏаЁ¬Ґа:
(DEFUN REMD (SYMBOL)
((SYMBOLP SYMBOL)
(change SYMBOL's function cell to be yndefined) ) )
(PUTD 'SWITCH '(LAMBDA (SYM1 SYM2) (CONS SYM2 SYM1)))
(SWITCH 'DOG 'CAT) --> (CAT . DOG)
(REMD 'SWITCH) --> SWITCH
(GETD 'SWITCH) --> NIL
(SWITCH 'DOG 'CAT) --> "Undefintd Function" error break
PUTD: 'PUTD Control variable
Љ®Ј¤ ®ЇаҐ¤Ґ«ҐЁҐ дгЄжЁЁ бЄ®¬ЇЁ«Ёа®ў ®, ®бгйҐбвў«пҐвбп
Ї®ЁбЄ бгйҐбвўгойЁе нЄўЁў «Ґв®ў D-Є®¤ ¤«п Є ¦¤®Ј® Ї®¤ўла ¦ҐЁп ў
®ЇаҐ¤Ґ«ҐЁЁ. …б«Ё в Є®© нЄўЁў «Ґв D-Є®¤ ©¤Ґ, ® ЁбЇ®«м§гҐвбп
ў¬Ґбв® ¤ «мҐ©иҐЈ® б®§¤ Ёп D-Є®¤ , ў бўп§Ё б 祬 нЄ®®¬Ёвбп
Ї ¬пвм. ќв®в Їа®жҐбб §лў Ґвбп Є®¤Ґб жЁҐ©.
…б«Ё Єава®«м п ЇҐаҐ¬Ґ п PUTD Ґбвм ҐNIL, в® Ї®ЁбЄ ЇаЁ
Є®¤Ґб жЁЁ ®Ја ЁзҐ б®ЎбвўҐл¬ D-Є®¤®¬ ®ЇаҐ¤Ґ«ҐЁп. •®вп ЇаЁ
н⮬ 㢥«ЁзЁў Ґвбп ®ЎмҐ¬ ЁбЇ®«м§гҐ¬®© Ї®¤ D-Є®¤ Ї ¬пвЁ,
®Ја ЁзҐЁҐ ®Ў« бвм Ї®ЁбЄ § зЁвҐ«м® 㬥ми Ґв ўаҐ¬п
з⥨Ґ Ё Є®¬ЇЁ«пжЁо д ©«®ў, ᮤҐа¦ йЁе Ў®«м讥 Є®«ЁзҐбвў®
®ЇаҐ¤Ґ«ҐЁ© дгЄжЁ©.
…б«Ё PUTD Ґбвм NIL, Ї®ЁбЄ ЇаЁ Є®¤Ґб жЁЁ ®еў влў Ґв ўбҐ
бгйҐбвўгойЁҐ D-Є®¤л. ќв® 㬥ми Ґв ®ЎмҐ¬ Ї ¬пвЁ, ваҐЎгҐ¬л© ¤«п
еа ҐЁп ¤ ®Ј® Є®«ЁзҐбвў ®ЇаҐ¤Ґ«ҐЁ© дгЄжЁ©, ® § в®
㢥«ЁзЁў Ґв ўаҐ¬п Є®¬ЇЁ«пжЁо ®ЇаҐ¤Ґ«ҐЁ© дгЄжЁ©.
Љ®Ј¤ дгЄжЁп, ®ЇаҐ¤Ґ«Ґ п Ї®«м§®ў ⥫Ґ¬, ЇҐаҐ®ЇаҐ¤Ґ«Ґ б
Ї®¬®ймо PUTD Ё«Ё MOVD, Ё«Ё ҐҐ ®ЇаҐ¤Ґ«ҐЁҐ г¤ «Ґ® б Ї®¬®ймо REMD,
D-Є®¤, ЁбЇ®«м§гҐ¬л© ¤«п еа ҐЁп ®ЇаҐ¤Ґ«ҐЁп, ўв®¬ вЁзҐбЄЁ
ЇҐаҐг⢥ত Ґвбп, Ґб«Ё Ї®«Ґ п Є®¤Ґб жЁп Ґ Ўл« ўлЇ®«Ґ (в.Ґ.
Ґб«Ё PUTD Ґ Ўл« а ўҐ NIL).
DEFUN [symbol,arglist,form1,...,form N] Special form
DEFUN [symbol,(ftype arglist,form1,...,form N)] Special form
‘ЇҐжЁ «м п д®а¬ ¤«п ®ЇаҐ¤Ґ«ҐЁп дгЄжЁ© DEFUN ўл§лў Ґвбп
¤ўг¬п бЇ®б®Ў ¬Ё. ЏҐаўл© бЇ®б®Ў Ў®«ҐҐ Єа вЄЁ©, ® ¬®¦Ґв
ЁбЇ®«м§®ў вмбп в®«мЄ® ¤«п ®ЇаҐ¤Ґ«ҐЁп дгЄжЁ©. ‚в®а®© бЇ®б®Ў,
Єа®¬Ґ в®Ј®, ¬®¦Ґв ЁбЇ®«м§®ў вмбп ¤«п ®ЇаҐ¤Ґ«ҐЁп ҐўлзЁб«пҐ¬ле
дгЄжЁ© Ё ¬ Єа®б®ў.
(DEFUN бЁ¬ў®« аЈ.бЇЁб®Є д®а¬ 1 ... д®а¬ N) Є®¬ЇЁ«ЁагҐв
< аЈ.бЇЁб®Є> Ё д®а¬ЁагҐв ҐЈ® D-Є®¤Ґ, ЇаҐ¤Ї®« Ј п, зв® вЁЇ
дгЄжЁЁ - ўлзЁб«пҐ¬ п, Ё«Ё LAMBDA. ‡ ⥬ DEFUN ¬®¤ЁдЁжЁагҐв
н«Ґ¬Ґв ®ЇаҐ¤Ґ«ҐЁп дгЄжЁЁ <бЁ¬ў®« > гЄ § ЁҐ
१г«мвЁагойЁ© D-Є®¤ Ё ў®§ўа й Ґв <бЁ¬ў®«>.
…б«Ё <f-вЁЇ> Ґбвм бЁ¬ў®« LAMBDA, NLAMBDA Ё«Ё MACRO, (DEFUN
бЁ¬ў®« (f-вЁЇ аЈ.бЇЁб®Є д®а¬ 1 ... д®а¬ N)) Є®¬ЇЁ«ЁагҐв
< аЈ.бЇЁб®Є> Ё д®а¬ЁагҐв ҐЈ® D-Є®¤Ґ, ЇаҐ¤Ї®« Ј п, зв® <F-вЁЇ>
- нв® ®ЇаҐ¤Ґ«ҐЁҐ ўлзЁб«пҐ¬®©, ҐўлзЁб«пҐ¬®© Ё«Ё ¬ Єа®-дгЄжЁЁ.
‡ ⥬ DEFUN ¬®¤ЁдЁжЁагҐв дгЄжЁ® «мл© н«Ґ¬Ґв <бЁ¬ў®« >
гЄ § ЁҐ १г«мвЁагойЁ© D-Є®¤ Ё ў®§ўа й Ґв <бЁ¬ў®«>.
…б«Ё < ¤аҐб> (<address>) а ўҐ г«о Ё«Ё пў«пҐвбп
Ї®«®¦ЁвҐ«мл¬ жҐ«л¬, ¬ҐмиҐ, 祬 65536, (DEFUN бЁ¬ў®« ¤аҐб)
¬®¤ЁдЁжЁагҐв н«Ґ¬Ґв дгЄжЁЁ <бЁ¬ў®« > гЄ § ЁҐ < ¤аҐб> Ё
ў®§ўа й Ґв <бЁ¬ў®«>.
ЏаЁ¬Ґа:
(DEFMACRO DEFUN (SYMBOL . BODY)
((ATOM BODY) NUIL)
((NUMBERP (CAR BODY))
(LIST 'PUTD (LIST 'QUOTE SYMBOL) (CAR BODY)) )
((MEMBER (CAAR BODY) '(LAMBDA NLAMBDA MACRO))
(LIST 'PUTD (LIST 'QUOTE SYMBOL) (CONS 'QUOTE BODY)) )
(LIST 'PUTD (LIST 'QUOTE SYMBOL)
(LIST 'QUOTE (CONS 'LAMBDA BODY))) )
DEFMACRO [symbol,arglist,form1,...,form N] Special form
(DEFMACRO бЁ¬ў®« аЈ.бЇЁб®Є д®а¬ 1 ... д®а¬ N)
¤ҐбвагЄвгаЁагҐв Ё Є®¬ЇЁ«ЁагҐв < аЈ.бЇЁб®Є> Ё ўбҐ <д®а¬л>
D-Є®¤, ¬®¤ЁдЁжЁагҐв н«Ґ¬Ґв ®ЇаҐ¤Ґ«ҐЁп дгЄжЁЁ <бЁ¬ў®« >
гЄ § ЁҐ १г«мвЁагойЁ© D-Є®¤ Ё ў®§ўа й Ґв <бЁ¬ў®«>.
‚ ®в«ЁзЁҐ ®в DEFUN, DEFMACRO ®ЎҐбЇҐзЁў Ґв ¤ҐбвагЄвгаЁа®ў ЁҐ
< аЈ.бЇЁбЄ >. ќв® ®§ з Ґв, зв® аЈг¬Ґвл § ЄаҐЇ«повбп §
бЁ¬ў®« ¬Ё ў < аЈ.бЇЁбЄҐ> ®б®ўҐ бвагЄвгал < аЈ.бЇЁбЄ > ў ўЁ¤Ґ
бўп§ ®Ј® бЇЁбЄ . …б«Ё < аЈ.бЇЁб®Є> Ґбвм бЁ¬ў®«, в® д ЄвЁзҐбЄЁҐ
аЈг¬Ґвл ў ¬ Єа®ўл§®ўҐ бўп§ л б бЁ¬ў®« ¬Ё. ‘ ¤агЈ®© бв®а®л,
car-н«Ґ¬Ґвл аЈг¬Ґв®ў ४габЁў® бўп§ л б car-н«Ґ¬Ґв ¬Ё
< аЈ.бЇЁбЄ >, cdr-н«Ґ¬Ґвл аЈг¬Ґв®ў - б cdr-н«Ґ¬Ґв ¬Ё
< аЈ.бЇЁбЄ >.
ЏаЁ¬Ґа:
(PUTD DEFMACRO 'MACRO BODY
(POP BODY)
(LIST 'PUTD
(LIST 'QUOTE (CAR BODY))
(LIST 'QUOTE
(LIST 'MACRO
'BODY
(CONS (LIST* 'LAMBDA
(Leaves (CADR BODY))
(CDDR BODY))
(Destructure (CADR BODY) '(CDR BODY)
(DEFUN Leaves (TREE)
((ATOM TREE)
(LIST TREE) )
((NULL (CDR TREE))
(Leaves (CAR TREE)) )
(NCONC (Leaves (CAR TREE)) (Leaves (CDR TREE))) )
(DEFUN Destructure (TREE FORM)
((ATOM TREE)
(LIST FORM) )
((NULL (CDR TREE))
(Destructure (CAR TREE) (LIST 'CAR FORM)) )
(NCONC (Destructure (CAR TREE) (LIST 'CAR FORM))
(Destructure (CDR TREE) (LIST 'CDR FORM))) )
5.11. ‘ва®Є®ўлҐ дгЄжЁЁ
‘ва®Є®ўлҐ дгЄжЁЁ ЇаҐ¤ § зҐл ¤«п а Ў®вл б ⥪бв ¬Ё Ё
п§лЄ ¬Ё. ЋЁ ®ЎҐбЇҐзЁў ов ўлЇ®«ҐЁҐ Ў®«ми®Ј® Є®«ЁзҐбвў
бва®Є®ўле ®ЇҐа жЁ© ¤«п ба ўҐЁп, Ї®ЁбЄ , Ё§ў«ҐзҐЁп Ё
ЇаҐ®Ўа §®ў Ёп print-Ё¬Ґ бЁ¬ў®«®ў Ё зЁбҐ«.
Print-Ё¬п (а-Ё¬п) бЁ¬ў®« § ЇЁблў Ґвбп в®з® в Є ¦Ґ, Є Є Ё
бва®ЄЁ бЁ¬ў®« . ђ-Ё¬п зЁб« ¤®«¦® Ё§ў«ҐЄ вмбп Ё§ ҐЈ® § 票п,
Є®в®а®Ґ еа Ёвбп ў ¤ў®Ёз®¬ ўЁ¤Ґ. ‘ва®Є®ўлҐ дгЄжЁЁ, ўл§лў Ґ¬лҐ б
зЁб«®ўл¬Ё аЈг¬Ґв ¬Ё, ўв®¬ вЁзҐбЄЁ б®§¤ ов бва®Єг бЁ¬ў®«®ў -
нЄўЁў «Ґв зЁб«®ў®Ј® § зҐЁп ®б®ўҐ ⥪г饩 бЁб⥬л бзЁб«ҐЁп
(б¬. *PRINT-BASE* ў а §¤.5-14).
‘«Ґ¤®ў ⥫м®, ў ¦® ®в¬ҐвЁвм, зв® а-Ё¬п зЁб« , Є Є ўЁ¤®
ЇаЁ¬ҐаҐ, Ё§¬ҐпҐвбп б Ё§¬ҐҐЁҐ¬ ⥪г饩 бЁб⥬л бзЁб«ҐЁп.
UNPACK [atom] Fonction
(UNPACK ⮬) ў®§ўа й Ґв бЇЁб®Є бЁ¬ў®«®ў, Ј¤Ґ а-Ё¬Ґ
Є ¦¤®Ј® бЁ¬ў®« б®бв®пв Ё§ бЁ¬ў®«®ў ў ЇҐз ⮬ ЇаҐ¤бв ў«ҐЁЁ
< ⮬ >. …б«Ё < ⮬> Ґ пў«пҐвбп ⮬®¬, UNPACK ў®§ўа й Ґв NIL.
‚ ¤агЈЁе ўҐабЁпе LISP дгЄжЁп UNPACK ¬®¦Ґв Ё¬Ґвм Ё¬п EXPLODE.
ЏаЁ¬Ґа:
(DEFUN UNPACK (ATM)
((SYMBOLP ATM)
(a list of symbols whose print names consist of the
character in the print name of ATM) )
((NUMBERP ATM)
(a list of symbols whose print names consist of the
digits in the printed represented of ATM) ) )
(UNPACK 'ABCDE) --> (A B C D E)
(SETQ FOO -216) --> -216
(UNPACK FOO) --> (- \2 \1 \6)
(SETQ *PRINT-BASE* 16) --> 10
(UNPACK FOO) --> (- \0 D \8)
(SETQ *PRINT-BASE* 10) --> 10
PACK [list] Function
(PACK бЇЁб®Є) ў®§ўа й Ґв бЁ¬ў®«, г Є®в®а®Ј® а-Ё¬п б®бв®Ёв Ё§
б楯«Ґле а-Ё¬Ґ ⮬®ў ў <бЇЁбЄҐ>. „«п ®ЇаҐ¤Ґ«ҐЁп а-Ё¬Ґ зЁбҐ«
ЁбЇ®«м§гҐвбп ⥪гй п бЁб⥬ бзЁб«ҐЁп. Ћв¬ҐвЁ¬, зв® PACK ўбҐЈ¤
ў®§ўа й Ґв бЁ¬ў®«, ¤ ¦Ґ Ґб«Ё а-Ё¬п б®бв®Ёв в®«мЄ® Ё§ ®¤®§ зле
зЁбҐ«.
‚ ¤агЈЁе ўҐбЁпе LISP PACK ¬®¦Ґв Ё¬Ґвм Ё¬п COMPRESS Ё«Ё
IMPLODE.
ЏаЁ¬Ґа:
(DEFUN PACK (LST)
((ATOM LST) "")
((SYMBOLP (CAR LST))
(the symbol whose print name consists of the print name
of (CAR LST) concatenated with (PACK (CDR LST))) )
((NUMBERP (CAR LST))
(the symbol whose print name consists of the digits in
the printed representation of (CAR LST)
concatenated with (PACK (CDR LST))) )
(PACK (CDR LST)) )
(PACK '(A B C)) --> ABC
(PACK '(3 A 5)) --> |3A5|
PACK* [atom1,atom2,...,atom N] Function
(PACK* ⮬1 ... ⮬N) ў®§ўа й Ґв бЁ¬ў®«, г Є®в®а®Ј® а-Ё¬п
б®бв®Ёв Ё§ б楯«Ґле а-Ё¬Ґ < ⮬ 1>, ..., < ⮬ N>. PACK*
пў«пҐвбп Ў®«ҐҐ г§Є®© ўҐабЁҐ© PACK, в.Є. ® а Ў®в Ґв Ґ б® бЇЁбЄ®¬
⮬®ў, б Їа®Ё§ў®«мл¬ Є®«ЁзҐбвў®¬ ⮬®ў.
ЏаЁ¬Ґа:
(DEFUN PACK* LST
(PACK LST) )
(PACK* 'A 'B 'C) --> ABC
(PACK* 3 'A 5) --> |3A5|
CHAR [atom,n] Function
…б«Ё < ⮬> - «ЁЎ® бЁ¬ў®«, «ЁЎ® зЁб«®, <n> -
Ґ®ваЁж ⥫쮥 楫®Ґ зЁб«®, (CHAR ⮬ n) ў®§ўа й Ґв бЁ¬ў®«, г
Є®в®а®Ј® а-Ё¬п Ґбвм n-© бЁ¬ў®« а-Ё¬ҐЁ < ⮬ >, ЇаЁзҐ¬ ®вбзҐв
ўҐ¤Ґвбп б 0. CHAR ў®§ўа й Ґв NIL, Ґб«Ё <n> - Ё ®«м, Ё
Ї®«®¦ЁвҐ«м®Ґ 楫®Ґ зЁб«®, Ё«Ё Ґб«Ё а-Ё¬п < ⮬ > ᮤҐа¦Ёв
¬ҐмиҐ, 祬 n, бЁ¬ў®«®ў.
ЏаЁ¬Ґа:
(DEFUN CHAR (ATM N)
((ATOM ATM)
(NTH N (UNPACK ATM)) ) )
(CHAR 'ABCDEFG 3) --> D
(CHAR 5432 0) --> \5
SUBSTRING [atom,n,m] Function
…б«Ё < ⮬> - ¤ЁЎ® бЁ¬ў®«, «ЁЎ® зЁб«®, <n> Ё <m> -
Ґ®ваЁж ⥫млҐ жҐ«лҐ, Ё n<=m, в® (SUBSTRING ⮬ n m) ў®§ўа й Ґв
бЁ¬ў®«, г Є®в®а®Ј® а-Ё¬п б®бв®Ёв Ё§ бЁ¬ў®«®ў а-Ё¬ҐЁ < ⮬ >,
зЁ п б n-Ј® Ї® m-©, ЇаЁзҐ¬ ®вбзҐв бЁ¬ў®«®ў ўҐ¤Ґвбп б 0.
‚ᥠ§ 票п <n> ¬ҐмиҐ, 祬 0, ЇаЁЁ¬ овбп а ўл¬Ё 0. …б«Ё
<m> Їа®Їг饮, пў«пҐвбп ®ваЁж ⥫мл¬ жҐ«л¬ Ё«Ё Ў®«миҐ, 祬
Є®«ЁзҐбвў® бЁ¬ў®«®ў ў а-Ё¬ҐЁ < ⮬ >, ЇаЁЁ¬ Ґвбп, зв® <m> а ў®
Є®«ЁзҐбвўг бЁ¬ў®«®ў ў а-Ё¬ҐЁ. …б«Ё <n> Ў®«миҐ Ё«Ё а ў®
Є®«ЁзҐбвўг бЁ¬ў®«®ў ў а-Ё¬ҐЁ Ё«Ё Ґб«Ё n>m, SUBSTRING ў®§ўа й Ґв
бЁ¬ў®«, г Є®в®а®Ј®а-Ё¬п Ґбвм г«Ґў п бва®Є .
Ћв¬ҐвЁ¬, зв® SUBSTRING ўбҐЈ¤ ў®§ўа й Ґв бЁ¬ў®«, ¤ ¦Ґ Ґб«Ё
< ⮬> Ґбвм зЁб«®.
ЏаЁ¬Ґа:
(DEFUN SUBSTRING (ATM N M)
((AND (ATOM ATM) (INTEGERP N))
((MINUSP N)
(SUBSTRING ATM 0 M) )
(PACK (SUBLIST (UNPACK ATM) N M)) ) )
(SUBSTRING 'ABCDEFG 2 4) --> CDE
(SUBSTRING 'ABCDEFG 2) --> CDEFG
(SUBSTRING 'ABCDEFG 0 4) --> ABCDE
(SUBSTRING 1000 0) --> |1000| ; converts 1000
to sybmol
STRING= [atom1,atom2,flag] Function
…б«Ё а-Ё¬п < ⮬ 1> «ҐЄбЁЈа дЁзҐбЄЁ а ў® а-Ё¬ҐЁ < ⮬ 2>,
(STRING ⮬1 ⮬2) ў®§ўа й Ґв ’, Ё зҐ - NIL. …б«Ё <д« Ј> Ґ
а ўҐ NIL, (STRING ⮬1 ⮬2 д« Ј) ўлЇ®«пҐв «®ЈЁз®Ґ
ба ўҐЁҐ, ® ЎҐ§ а §«ЁзЁп § Ј« ўле Ё Їа®ЇЁбле ЎгЄў.
ЏаЁ¬Ґа:
(DEFUN STRING= (ATM1 ATM2 FLAG)
((AND (ATOM ATM1) (ATOM ATM2))
((NULL FLAG)
((if ATM1's print name is lexicographically
equal to ATM2's print name) T) )
((if ATM1's print name is lexicographically, by
ignoring case, equal to ATM2's print name) T) ) )
(STRING= 'FAST 'FASTER) --> NIL
(STRING= 100 |100|) --> T
(STRING= 'Fast 'FAST T) --> T
STRING< [atom1,atom2,flag] Function
STRING> [atom1,atom2,flag] Function
STRING<= [atom1,atom2,flag] Function
STRING>= [atom1,atom2,flag] Function
STRING/= [atom1,atom2,flag] Function
…б«Ё а-Ё¬п < ⮬ 1> «ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬ҐмиҐ, 祬 а-Ё¬п
< ⮬ 2>, (STRING< ⮬1 ⮬2) ў®§ўа й Ґв ®¬Ґа Ї®§ЁжЁЁ ЇҐаў®Ј®
бЁ¬ў®« , зЁ п б Є®в®а®Ј® а-Ё¬Ґ Ґ б®ўЇ ¤ ов; ў Їа®вЁў®¬
б«гз Ґ ® ў®§ўа й Ґв NIL. …б«Ё <д« Ј> Ґ а ўҐ NIL, (STRING<
⮬1 ⮬2 д« Ј) ўлЇ®«пҐв «®ЈЁз®Ґ ба ўҐЁҐ, ® ЎҐ§
а §«ЁзЁп § Ј« ўле Ё Їа®ЇЁбле ЎгЄў.
„агЈЁҐ дгЄжЁЁ в Є¦Ґ ўлЇ®«пов «ҐЄбЁЄ®Ја дЁзҐбЄ®Ґ ба ўҐЁҐ
Ё ў®§ўа й ов Ё«Ё NIL. Ё«Ё ®¬Ґа Ї®§ЁжЁЁ ЇҐаў®Ј® Ґб®ўЇ ¤ о饣®
бЁ¬ў®« ў а-Ё¬Ґ е. STRING> ба ўЁў Ґв а-Ё¬Ґ >, STRING<= -
<=, STRING>= - >=, STRING/= - Ґ а ў®.
ЏаЁ¬Ґа:
(DEFUN STRING< (ATM1 ATM2 FLAG)
((AND (ATOM ATM1) (ATOM ATM2))
((NULL FLAG)
((if ATM1's print name is lexicographically
less than ATM2's print name)
(the position of the first mismatch)) )
((if ATM1's print name is lexicographically, by
ignoring case, less than ATM2's print name)
(the position of the first mismatch)) ) )
(STRING< 'DOG 'CAT) --> NIL
(STRING< 'CAT 'DOG) --> 0
(STRING< 'DOG 'DOGGY) --> 3
(STRING<= 'DOG 'DOG) --> 3
(STRING/= 'DOG 'DOG) --> NIL
Ќ з «млҐ ўла ¦ҐЁп ЁбЇ®«м§говбп ¤«п ¬ ЁЇг«Ёа®ў Ёп
®ЇаҐ¤Ґ«ҐЁп¬Ё дгЄжЁ©. Љ®Ј¤ дгЄжЁп ®ЇаҐ¤Ґ«пҐвбп, нв®
®ЇаҐ¤Ґ«ҐЁҐ ўв®¬ вЁзҐбЄЁ ЇбҐў¤®Є®¬ЇЁ«ЁагҐвбп ў бЁ«м® б¦ вго,
Є®¬Ї Євго д®а¬г - в Є §лў Ґ¬л© D-Є®¤.
ЋЎа вл© Їа®жҐбб ¤ҐЄ®¬ЇЁ«пжЁЁ ®ЇаҐ¤Ґ«ҐЁ© дгЄжЁ© ў
бўп§ л© бЇЁб®Є ®бгйҐбвў«пҐвбп ўв®¬ вЁзҐбЄЁ б ЁбЇ®«м§®ў ЁҐ¬
GETD ¤«п ў®ббв ®ў«ҐЁп ®ЇаҐ¤Ґ«ҐЁ©. ‘«Ґ¤®ў ⥫м®, Ё Є®¬ЇЁ«пжЁп,
Ё ¤ҐЄ®¬ЇЁ«пжЁп ҐўЁ¤Ё¬л ¤«п Ї®«м§®ў ⥫п.
GETD [svmbol,tvpe-only-flag] Function
…б«Ё <бЁ¬ў®«> Ґбвм дгЄжЁп, ®ЇаҐ¤Ґ«Ґ п Ї®«м§®ў ⥫Ґ¬,
(GETD бЁ¬ў®«) ¤ҐЄ®¬ЇЁ«ЁагҐв Ё ўл¤ Ґв ®ЇаҐ¤Ґ«ҐЁҐ <бЁ¬ў®« > ў
д®а¬Ґ бўп§ ®Ј® бЇЁбЄ . …б«Ё <бЁ¬ў®«> - Їа®бв п дгЄжЁп Ё«Ё
бЇҐжЁ «м п д®а¬ , (GETD бЁ¬ў®«) ў®§ўа й Ґв ¤аҐб ў дЁ§ЁзҐбЄ®©
Ї ¬пвЁ и Ў«® ¬ иЁ®¬ п§лЄҐ. …б«Ё <бЁ¬ў®«> Ґ пў«пҐвбп
бЇҐжЁ «м®© д®а¬®© Ё«Ё дгЄжЁҐ©, (GETD бЁ¬ў®«) ў®§ўа й Ґв NIL.
…б«Ё <д« Ј> Ґбвм Ґ NIL, (GETD бЁ¬ў®« д« Ј) ў®§ўа й Ґв
SPECIAL, Ґб«Ё <бЁ¬ў®«> пў«пҐвбп бЇҐжЁ «м®© д®а¬®©, LAMBDA, Ґб«Ё
<бЁ¬ў®«> пў«пҐвбп дгЄжЁҐ© ўлзЁб«ҐЁп, NLAMBDA, Ґб«Ё <бЁ¬ў®«> Ґ
пў«пҐвбп дгЄжЁҐ© ўлзЁб«ҐЁп, MACRO, Ґб«Ё <бЁ¬ў®«> пў«пҐвбп
¬ Єа®-дгЄжЁҐ©, Ё«Ё NIL, Ґб«Ё <бЁ¬ў®«> Ґ®ЇаҐ¤Ґ«Ґ.
ЏаЁ¬Ґа:
(DEFUN GETD (SYMBOL FLAG)
((NOT (SYMBOLP SYMBOL)) NIL)
((undefined SYMBOL) NIL)
((NULL FLAG)
((machine language routine SYMBOL)
(the memory address of the routine) )
(the S-expression equvalent of the D-code defining
the function SYMBOL) )
((special form SYMBOL) 'SPECIAL)
((eval function SYMBOL) 'LAMBDA)
((no-eval function SYMBOL) 'NLAMBDA)
((macro function SYMBOL) 'MACRO) )
PUTD [symbol,definition] Function
(PUTD бЁ¬ў®« ®ЇаҐ¤Ґ«ҐЁҐ) Є®¬ЇЁ«ЁагҐв <®ЇаҐ¤Ґ«ҐЁҐ> ў
D-Є®¤, ¬®¤ЁдЁжЁагҐв н«Ґ¬Ґв ®ЇаҐ¤Ґ«ҐЁп дгЄжЁЁ <бЁ¬ў®« >
гЄ § ЁҐ Є®¬ЇЁ«ЁагҐ¬л© D-Є®¤ Ё ў®§ўа й Ґв <бЁ¬ў®«>. ЋЎмҐЄвл,
Ґ пў«пойЁҐбп ⮬ ¬Ё (в.Ґ. Є®бв вл), ў ®ЇаҐ¤Ґ«ҐЁЁ дгЄжЁЁ Ґ
Є®¬ЇЁ«Їаговбп, ® ®бв овбп б®еа Ґл¬Ё Є Є бўп§ л© бЇЁб®Є.
‘«Ґ¤®ў ⥫м®, ў ®в«ЁзЁҐ ®в Ў®«ҐҐ а Ёе ўҐабЁ©, ЁвҐаЇаҐв в®а
muLISP-85 Ґ ¤®«¦Ґв ¤ҐЄ®¬ЇЁ«Ёа®ў вм в ЄЁҐ Є®бв вл Є ¦¤л© а §,
Є Є ®Ё ўбваҐз овбп, Ё Є®бв вл ¬®Јгв ᮤҐа¦ вм cons-л б
cdr-н«Ґ¬Ґв ¬Ё, пў«пойЁ¬Ёбп ҐNIL- ⮬ ¬Ё.
ЏҐаҐ¬Ґ п PUTD гЇа ў«пҐв б¦ вЁҐ¬ D-Є®¤ ў® ўаҐ¬п
Є®¬ЇЁ«пжЁЁ. ЏҐаҐ¬Ґ п MACROEXPAND гЇа ў«пҐв ¬ Єа®а биЁаҐЁҐ¬ ў®
ўаҐ¬п Є®¬ЇЁ«пжЁЁ.
„«п бўп§Ё б ®ЇаҐ¤Ґ«Ґл¬Ё Ї®«м§®ў ⥫Ґ¬ и Ў«® ¬Ё
¬ иЁ®¬ п§лЄҐ PUTD ўл§лў Ґвбп б <®ЇаҐ¤Ґ«ҐЁҐ¬>, а ўл¬ ¤аҐб ¬ ў
дЁ§ЁзҐбЄ®© Ї ¬пвЁ нвЁе и Ў«®®ў. „«п Ў®«ҐҐ ¤Ґв «м®Ј®
а бᬮваҐЁп Їа ўЁ« а Ў®вл б и Ў«® ¬Ё ¬ иЁ®¬ п§лЄҐ б¬.
Ј« ўг 7.
ЏаЁ¬Ґа:
(DEFUN PUTD (SYMBOL DEFN)
((OR (NOT (SYMBOLP SYMBOL)) (SYMBOLP DEFN)) NIL)
((NUMBER DEFN)
((AND (INTEGERP DEFN) (PLUSP DEFN))
(store DEFN in SYMBOL's function cell)
SYMBOL ) )
(compile DEFN into D-code)
(store a pointer to the D-code in SYMBOL's function cell)
SYMBOL )
(PUTD 'SQUARE '(LAMBDA (NUM) (*NUM NUM))) --> SQUARE
(SQUARE 5) --> 25
MOVD [symbol1,symbol2] Function
(MOVD бЁ¬ў®«1 бЁ¬ў®«2) ЇҐаҐ¤ Ґв ®ЇаҐ¤Ґ«ҐЁҐ дгЄжЁЁ ®в
<бЁ¬ў®« 1> Є <бЁ¬ў®«г2> Ё ў®§ўа й Ґв <бЁ¬ў®«2>. ‚ вҐе б«гз пе,
Є®Ј¤ ¤®бв в®з® дгЄжЁЁ MOVD, ® ¬®¦Ґв ЁбЇ®«м§®ў вмбп ў¬Ґбв®
Є®¬ЎЁ жЁЁ GETD-PUTD, в.Є. Ґ вॡгҐв ЇҐаҐЄ®¬ЇЁ«пжЁЁ.
Ќ ЇаЁ¬Ґа е Ї®Є § ®, Є Є ¬®¦® ЁбЇ®«м§®ў вм MOVD ¤«п
ЇаЁбў Ёў Ёп ¤агЈЁе ¬Ґ¬®ЁзҐбЄЁе Ё¬Ґ ҐЄ®в®ал¬ дгЄжЁп¬
ᥫҐЄв®а LISP ЎҐ§ гйҐаЎ ¤«п нд䥪⨢®бвЁ Ёе ўлЇ®«ҐЁп.
ЏаЁ¬Ґа:
(DEFUN MOVD (SYMBOL1 SYMBOL2)
((AND (SYMBOLP SYMBOL1) (SYMBOLP SYMBOL2))
(replace the contents of SYMBOL2's function cell with
the contents of SYMBOL1's function cell)
SYMBOL2 ) )
(MOVD 'CAR 'FIRST) --> FIRST
(MOVD 'CDR 'REST) --> REST
(MOVD 'CADR 'SECOND) --> SECOND
(MOVD 'CADDR 'THIRD) --> THIRD
(MOVD 'CADDDR 'FOURTH) --> FOURTH
(FIRST '(A B C D)) --> A
REMD [symbol] Function
(REMD бЁ¬ў®«) ¬®¤ЁдЁжЁагҐв н«Ґ¬Ґв ®ЇаҐ¤Ґ«ҐЁп дгЄжЁЁ
<бЁ¬ў®« >, ¤Ґ« п <бЁ¬ў®«> Ґ®ЇаҐ¤Ґ«Ґл¬. REMD ў®§ўа й Ґв
<бЁ¬ў®«>. ’.Є. бЁ¬ў®«л, Ґб«Ё ®Ё, Ї®¬Ё¬® ўбҐЈ® Їа®зҐЈ®,
Ґ®ЇаҐ¤Ґ«Ґл, ¬®Јгв Ўлвм ўлЎа л в®«мЄ® бЎ®айЁЄ®¬ ¬гб®а , REMD
з бв® ЁбЇ®«м§гов ¤«п нвЁе 楫Ґ©.
ЏаЁ¬Ґа:
(DEFUN REMD (SYMBOL)
((SYMBOLP SYMBOL)
(change SYMBOL's function cell to be yndefined) ) )
(PUTD 'SWITCH '(LAMBDA (SYM1 SYM2) (CONS SYM2 SYM1)))
(SWITCH 'DOG 'CAT) --> (CAT . DOG)
(REMD 'SWITCH) --> SWITCH
(GETD 'SWITCH) --> NIL
(SWITCH 'DOG 'CAT) --> "Undefintd Function" error break
PUTD: 'PUTD Control variable
Љ®Ј¤ ®ЇаҐ¤Ґ«ҐЁҐ дгЄжЁЁ бЄ®¬ЇЁ«Ёа®ў ®, ®бгйҐбвў«пҐвбп
Ї®ЁбЄ бгйҐбвўгойЁе нЄўЁў «Ґв®ў D-Є®¤ ¤«п Є ¦¤®Ј® Ї®¤ўла ¦ҐЁп ў
®ЇаҐ¤Ґ«ҐЁЁ. …б«Ё в Є®© нЄўЁў «Ґв D-Є®¤ ©¤Ґ, ® ЁбЇ®«м§гҐвбп
ў¬Ґбв® ¤ «мҐ©иҐЈ® б®§¤ Ёп D-Є®¤ , ў бўп§Ё б 祬 нЄ®®¬Ёвбп
Ї ¬пвм. ќв®в Їа®жҐбб §лў Ґвбп Є®¤Ґб жЁҐ©.
…б«Ё Єава®«м п ЇҐаҐ¬Ґ п PUTD Ґбвм ҐNIL, в® Ї®ЁбЄ ЇаЁ
Є®¤Ґб жЁЁ ®Ја ЁзҐ б®ЎбвўҐл¬ D-Є®¤®¬ ®ЇаҐ¤Ґ«ҐЁп. •®вп ЇаЁ
н⮬ 㢥«ЁзЁў Ґвбп ®ЎмҐ¬ ЁбЇ®«м§гҐ¬®© Ї®¤ D-Є®¤ Ї ¬пвЁ,
®Ја ЁзҐЁҐ ®Ў« бвм Ї®ЁбЄ § зЁвҐ«м® 㬥ми Ґв ўаҐ¬п
з⥨Ґ Ё Є®¬ЇЁ«пжЁо д ©«®ў, ᮤҐа¦ йЁе Ў®«м讥 Є®«ЁзҐбвў®
®ЇаҐ¤Ґ«ҐЁ© дгЄжЁ©.
…б«Ё PUTD Ґбвм NIL, Ї®ЁбЄ ЇаЁ Є®¤Ґб жЁЁ ®еў влў Ґв ўбҐ
бгйҐбвўгойЁҐ D-Є®¤л. ќв® 㬥ми Ґв ®ЎмҐ¬ Ї ¬пвЁ, ваҐЎгҐ¬л© ¤«п
еа ҐЁп ¤ ®Ј® Є®«ЁзҐбвў ®ЇаҐ¤Ґ«ҐЁ© дгЄжЁ©, ® § в®
㢥«ЁзЁў Ґв ўаҐ¬п Є®¬ЇЁ«пжЁо ®ЇаҐ¤Ґ«ҐЁ© дгЄжЁ©.
Љ®Ј¤ дгЄжЁп, ®ЇаҐ¤Ґ«Ґ п Ї®«м§®ў ⥫Ґ¬, ЇҐаҐ®ЇаҐ¤Ґ«Ґ б
Ї®¬®ймо PUTD Ё«Ё MOVD, Ё«Ё ҐҐ ®ЇаҐ¤Ґ«ҐЁҐ г¤ «Ґ® б Ї®¬®ймо REMD,
D-Є®¤, ЁбЇ®«м§гҐ¬л© ¤«п еа ҐЁп ®ЇаҐ¤Ґ«ҐЁп, ўв®¬ вЁзҐбЄЁ
ЇҐаҐг⢥ত Ґвбп, Ґб«Ё Ї®«Ґ п Є®¤Ґб жЁп Ґ Ўл« ўлЇ®«Ґ (в.Ґ.
Ґб«Ё PUTD Ґ Ўл« а ўҐ NIL).
DEFUN [symbol,arglist,form1,...,form N] Special form
DEFUN [symbol,(ftype arglist,form1,...,form N)] Special form
‘ЇҐжЁ «м п д®а¬ ¤«п ®ЇаҐ¤Ґ«ҐЁп дгЄжЁ© DEFUN ўл§лў Ґвбп
¤ўг¬п бЇ®б®Ў ¬Ё. ЏҐаўл© бЇ®б®Ў Ў®«ҐҐ Єа вЄЁ©, ® ¬®¦Ґв
ЁбЇ®«м§®ў вмбп в®«мЄ® ¤«п ®ЇаҐ¤Ґ«ҐЁп дгЄжЁ©. ‚в®а®© бЇ®б®Ў,
Єа®¬Ґ в®Ј®, ¬®¦Ґв ЁбЇ®«м§®ў вмбп ¤«п ®ЇаҐ¤Ґ«ҐЁп ҐўлзЁб«пҐ¬ле
дгЄжЁ© Ё ¬ Єа®б®ў.
(DEFUN бЁ¬ў®« аЈ.бЇЁб®Є д®а¬ 1 ... д®а¬ N) Є®¬ЇЁ«ЁагҐв
< аЈ.бЇЁб®Є> Ё д®а¬ЁагҐв ҐЈ® D-Є®¤Ґ, ЇаҐ¤Ї®« Ј п, зв® вЁЇ
дгЄжЁЁ - ўлзЁб«пҐ¬ п, Ё«Ё LAMBDA. ‡ ⥬ DEFUN ¬®¤ЁдЁжЁагҐв
н«Ґ¬Ґв ®ЇаҐ¤Ґ«ҐЁп дгЄжЁЁ <бЁ¬ў®« > гЄ § ЁҐ
१г«мвЁагойЁ© D-Є®¤ Ё ў®§ўа й Ґв <бЁ¬ў®«>.
…б«Ё <f-вЁЇ> Ґбвм бЁ¬ў®« LAMBDA, NLAMBDA Ё«Ё MACRO, (DEFUN
бЁ¬ў®« (f-вЁЇ аЈ.бЇЁб®Є д®а¬ 1 ... д®а¬ N)) Є®¬ЇЁ«ЁагҐв
< аЈ.бЇЁб®Є> Ё д®а¬ЁагҐв ҐЈ® D-Є®¤Ґ, ЇаҐ¤Ї®« Ј п, зв® <F-вЁЇ>
- нв® ®ЇаҐ¤Ґ«ҐЁҐ ўлзЁб«пҐ¬®©, ҐўлзЁб«пҐ¬®© Ё«Ё ¬ Єа®-дгЄжЁЁ.
‡ ⥬ DEFUN ¬®¤ЁдЁжЁагҐв дгЄжЁ® «мл© н«Ґ¬Ґв <бЁ¬ў®« >
гЄ § ЁҐ १г«мвЁагойЁ© D-Є®¤ Ё ў®§ўа й Ґв <бЁ¬ў®«>.
…б«Ё < ¤аҐб> (<address>) а ўҐ г«о Ё«Ё пў«пҐвбп
Ї®«®¦ЁвҐ«мл¬ жҐ«л¬, ¬ҐмиҐ, 祬 65536, (DEFUN бЁ¬ў®« ¤аҐб)
¬®¤ЁдЁжЁагҐв н«Ґ¬Ґв дгЄжЁЁ <бЁ¬ў®« > гЄ § ЁҐ < ¤аҐб> Ё
ў®§ўа й Ґв <бЁ¬ў®«>.
ЏаЁ¬Ґа:
(DEFMACRO DEFUN (SYMBOL . BODY)
((ATOM BODY) NUIL)
((NUMBERP (CAR BODY))
(LIST 'PUTD (LIST 'QUOTE SYMBOL) (CAR BODY)) )
((MEMBER (CAAR BODY) '(LAMBDA NLAMBDA MACRO))
(LIST 'PUTD (LIST 'QUOTE SYMBOL) (CONS 'QUOTE BODY)) )
(LIST 'PUTD (LIST 'QUOTE SYMBOL)
(LIST 'QUOTE (CONS 'LAMBDA BODY))) )
DEFMACRO [symbol,arglist,form1,...,form N] Special form
(DEFMACRO бЁ¬ў®« аЈ.бЇЁб®Є д®а¬ 1 ... д®а¬ N)
¤ҐбвагЄвгаЁагҐв Ё Є®¬ЇЁ«ЁагҐв < аЈ.бЇЁб®Є> Ё ўбҐ <д®а¬л>
D-Є®¤, ¬®¤ЁдЁжЁагҐв н«Ґ¬Ґв ®ЇаҐ¤Ґ«ҐЁп дгЄжЁЁ <бЁ¬ў®« >
гЄ § ЁҐ १г«мвЁагойЁ© D-Є®¤ Ё ў®§ўа й Ґв <бЁ¬ў®«>.
‚ ®в«ЁзЁҐ ®в DEFUN, DEFMACRO ®ЎҐбЇҐзЁў Ґв ¤ҐбвагЄвгаЁа®ў ЁҐ
< аЈ.бЇЁбЄ >. ќв® ®§ з Ґв, зв® аЈг¬Ґвл § ЄаҐЇ«повбп §
бЁ¬ў®« ¬Ё ў < аЈ.бЇЁбЄҐ> ®б®ўҐ бвагЄвгал < аЈ.бЇЁбЄ > ў ўЁ¤Ґ
бўп§ ®Ј® бЇЁбЄ . …б«Ё < аЈ.бЇЁб®Є> Ґбвм бЁ¬ў®«, в® д ЄвЁзҐбЄЁҐ
аЈг¬Ґвл ў ¬ Єа®ўл§®ўҐ бўп§ л б бЁ¬ў®« ¬Ё. ‘ ¤агЈ®© бв®а®л,
car-н«Ґ¬Ґвл аЈг¬Ґв®ў ४габЁў® бўп§ л б car-н«Ґ¬Ґв ¬Ё
< аЈ.бЇЁбЄ >, cdr-н«Ґ¬Ґвл аЈг¬Ґв®ў - б cdr-н«Ґ¬Ґв ¬Ё
< аЈ.бЇЁбЄ >.
ЏаЁ¬Ґа:
(PUTD DEFMACRO 'MACRO BODY
(POP BODY)
(LIST 'PUTD
(LIST 'QUOTE (CAR BODY))
(LIST 'QUOTE
(LIST 'MACRO
'BODY
(CONS (LIST* 'LAMBDA
(Leaves (CADR BODY))
(CDDR BODY))
(Destructure (CADR BODY) '(CDR BODY)
(DEFUN Leaves (TREE)
((ATOM TREE)
(LIST TREE) )
((NULL (CDR TREE))
(Leaves (CAR TREE)) )
(NCONC (Leaves (CAR TREE)) (Leaves (CDR TREE))) )
(DEFUN Destructure (TREE FORM)
((ATOM TREE)
(LIST FORM) )
((NULL (CDR TREE))
(Destructure (CAR TREE) (LIST 'CAR FORM)) )
(NCONC (Destructure (CAR TREE) (LIST 'CAR FORM))
(Destructure (CDR TREE) (LIST 'CDR FORM))) )
5.11. ‘ва®Є®ўлҐ дгЄжЁЁ
‘ва®Є®ўлҐ дгЄжЁЁ ЇаҐ¤ § зҐл ¤«п а Ў®вл б ⥪бв ¬Ё Ё
п§лЄ ¬Ё. ЋЁ ®ЎҐбЇҐзЁў ов ўлЇ®«ҐЁҐ Ў®«ми®Ј® Є®«ЁзҐбвў
бва®Є®ўле ®ЇҐа жЁ© ¤«п ба ўҐЁп, Ї®ЁбЄ , Ё§ў«ҐзҐЁп Ё
ЇаҐ®Ўа §®ў Ёп print-Ё¬Ґ бЁ¬ў®«®ў Ё зЁбҐ«.
Print-Ё¬п (а-Ё¬п) бЁ¬ў®« § ЇЁблў Ґвбп в®з® в Є ¦Ґ, Є Є Ё
бва®ЄЁ бЁ¬ў®« . ђ-Ё¬п зЁб« ¤®«¦® Ё§ў«ҐЄ вмбп Ё§ ҐЈ® § 票п,
Є®в®а®Ґ еа Ёвбп ў ¤ў®Ёз®¬ ўЁ¤Ґ. ‘ва®Є®ўлҐ дгЄжЁЁ, ўл§лў Ґ¬лҐ б
зЁб«®ўл¬Ё аЈг¬Ґв ¬Ё, ўв®¬ вЁзҐбЄЁ б®§¤ ов бва®Єг бЁ¬ў®«®ў -
нЄўЁў «Ґв зЁб«®ў®Ј® § зҐЁп ®б®ўҐ ⥪г饩 бЁб⥬л бзЁб«ҐЁп
(б¬. *PRINT-BASE* ў а §¤.5-14).
‘«Ґ¤®ў ⥫м®, ў ¦® ®в¬ҐвЁвм, зв® а-Ё¬п зЁб« , Є Є ўЁ¤®
ЇаЁ¬ҐаҐ, Ё§¬ҐпҐвбп б Ё§¬ҐҐЁҐ¬ ⥪г饩 бЁб⥬л бзЁб«ҐЁп.
UNPACK [atom] Fonction
(UNPACK ⮬) ў®§ўа й Ґв бЇЁб®Є бЁ¬ў®«®ў, Ј¤Ґ а-Ё¬Ґ
Є ¦¤®Ј® бЁ¬ў®« б®бв®пв Ё§ бЁ¬ў®«®ў ў ЇҐз ⮬ ЇаҐ¤бв ў«ҐЁЁ
< ⮬ >. …б«Ё < ⮬> Ґ пў«пҐвбп ⮬®¬, UNPACK ў®§ўа й Ґв NIL.
‚ ¤агЈЁе ўҐабЁпе LISP дгЄжЁп UNPACK ¬®¦Ґв Ё¬Ґвм Ё¬п EXPLODE.
ЏаЁ¬Ґа:
(DEFUN UNPACK (ATM)
((SYMBOLP ATM)
(a list of symbols whose print names consist of the
character in the print name of ATM) )
((NUMBERP ATM)
(a list of symbols whose print names consist of the
digits in the printed represented of ATM) ) )
(UNPACK 'ABCDE) --> (A B C D E)
(SETQ FOO -216) --> -216
(UNPACK FOO) --> (- \2 \1 \6)
(SETQ *PRINT-BASE* 16) --> 10
(UNPACK FOO) --> (- \0 D \8)
(SETQ *PRINT-BASE* 10) --> 10
PACK [list] Function
(PACK бЇЁб®Є) ў®§ўа й Ґв бЁ¬ў®«, г Є®в®а®Ј® а-Ё¬п б®бв®Ёв Ё§
б楯«Ґле а-Ё¬Ґ ⮬®ў ў <бЇЁбЄҐ>. „«п ®ЇаҐ¤Ґ«ҐЁп а-Ё¬Ґ зЁбҐ«
ЁбЇ®«м§гҐвбп ⥪гй п бЁб⥬ бзЁб«ҐЁп. Ћв¬ҐвЁ¬, зв® PACK ўбҐЈ¤
ў®§ўа й Ґв бЁ¬ў®«, ¤ ¦Ґ Ґб«Ё а-Ё¬п б®бв®Ёв в®«мЄ® Ё§ ®¤®§ зле
зЁбҐ«.
‚ ¤агЈЁе ўҐбЁпе LISP PACK ¬®¦Ґв Ё¬Ґвм Ё¬п COMPRESS Ё«Ё
IMPLODE.
ЏаЁ¬Ґа:
(DEFUN PACK (LST)
((ATOM LST) "")
((SYMBOLP (CAR LST))
(the symbol whose print name consists of the print name
of (CAR LST) concatenated with (PACK (CDR LST))) )
((NUMBERP (CAR LST))
(the symbol whose print name consists of the digits in
the printed representation of (CAR LST)
concatenated with (PACK (CDR LST))) )
(PACK (CDR LST)) )
(PACK '(A B C)) --> ABC
(PACK '(3 A 5)) --> |3A5|
PACK* [atom1,atom2,...,atom N] Function
(PACK* ⮬1 ... ⮬N) ў®§ўа й Ґв бЁ¬ў®«, г Є®в®а®Ј® а-Ё¬п
б®бв®Ёв Ё§ б楯«Ґле а-Ё¬Ґ < ⮬ 1>, ..., < ⮬ N>. PACK*
пў«пҐвбп Ў®«ҐҐ г§Є®© ўҐабЁҐ© PACK, в.Є. ® а Ў®в Ґв Ґ б® бЇЁбЄ®¬
⮬®ў, б Їа®Ё§ў®«мл¬ Є®«ЁзҐбвў®¬ ⮬®ў.
ЏаЁ¬Ґа:
(DEFUN PACK* LST
(PACK LST) )
(PACK* 'A 'B 'C) --> ABC
(PACK* 3 'A 5) --> |3A5|
CHAR [atom,n] Function
…б«Ё < ⮬> - «ЁЎ® бЁ¬ў®«, «ЁЎ® зЁб«®, <n> -
Ґ®ваЁж ⥫쮥 楫®Ґ зЁб«®, (CHAR ⮬ n) ў®§ўа й Ґв бЁ¬ў®«, г
Є®в®а®Ј® а-Ё¬п Ґбвм n-© бЁ¬ў®« а-Ё¬ҐЁ < ⮬ >, ЇаЁзҐ¬ ®вбзҐв
ўҐ¤Ґвбп б 0. CHAR ў®§ўа й Ґв NIL, Ґб«Ё <n> - Ё ®«м, Ё
Ї®«®¦ЁвҐ«м®Ґ 楫®Ґ зЁб«®, Ё«Ё Ґб«Ё а-Ё¬п < ⮬ > ᮤҐа¦Ёв
¬ҐмиҐ, 祬 n, бЁ¬ў®«®ў.
ЏаЁ¬Ґа:
(DEFUN CHAR (ATM N)
((ATOM ATM)
(NTH N (UNPACK ATM)) ) )
(CHAR 'ABCDEFG 3) --> D
(CHAR 5432 0) --> \5
SUBSTRING [atom,n,m] Function
…б«Ё < ⮬> - ¤ЁЎ® бЁ¬ў®«, «ЁЎ® зЁб«®, <n> Ё <m> -
Ґ®ваЁж ⥫млҐ жҐ«лҐ, Ё n<=m, в® (SUBSTRING ⮬ n m) ў®§ўа й Ґв
бЁ¬ў®«, г Є®в®а®Ј® а-Ё¬п б®бв®Ёв Ё§ бЁ¬ў®«®ў а-Ё¬ҐЁ < ⮬ >,
зЁ п б n-Ј® Ї® m-©, ЇаЁзҐ¬ ®вбзҐв бЁ¬ў®«®ў ўҐ¤Ґвбп б 0.
‚ᥠ§ 票п <n> ¬ҐмиҐ, 祬 0, ЇаЁЁ¬ овбп а ўл¬Ё 0. …б«Ё
<m> Їа®Їг饮, пў«пҐвбп ®ваЁж ⥫мл¬ жҐ«л¬ Ё«Ё Ў®«миҐ, 祬
Є®«ЁзҐбвў® бЁ¬ў®«®ў ў а-Ё¬ҐЁ < ⮬ >, ЇаЁЁ¬ Ґвбп, зв® <m> а ў®
Є®«ЁзҐбвўг бЁ¬ў®«®ў ў а-Ё¬ҐЁ. …б«Ё <n> Ў®«миҐ Ё«Ё а ў®
Є®«ЁзҐбвўг бЁ¬ў®«®ў ў а-Ё¬ҐЁ Ё«Ё Ґб«Ё n>m, SUBSTRING ў®§ўа й Ґв
бЁ¬ў®«, г Є®в®а®Ј®а-Ё¬п Ґбвм г«Ґў п бва®Є .
Ћв¬ҐвЁ¬, зв® SUBSTRING ўбҐЈ¤ ў®§ўа й Ґв бЁ¬ў®«, ¤ ¦Ґ Ґб«Ё
< ⮬> Ґбвм зЁб«®.
ЏаЁ¬Ґа:
(DEFUN SUBSTRING (ATM N M)
((AND (ATOM ATM) (INTEGERP N))
((MINUSP N)
(SUBSTRING ATM 0 M) )
(PACK (SUBLIST (UNPACK ATM) N M)) ) )
(SUBSTRING 'ABCDEFG 2 4) --> CDE
(SUBSTRING 'ABCDEFG 2) --> CDEFG
(SUBSTRING 'ABCDEFG 0 4) --> ABCDE
(SUBSTRING 1000 0) --> |1000| ; converts 1000
to sybmol
STRING= [atom1,atom2,flag] Function
…б«Ё а-Ё¬п < ⮬ 1> «ҐЄбЁЈа дЁзҐбЄЁ а ў® а-Ё¬ҐЁ < ⮬ 2>,
(STRING ⮬1 ⮬2) ў®§ўа й Ґв ’, Ё зҐ - NIL. …б«Ё <д« Ј> Ґ
а ўҐ NIL, (STRING ⮬1 ⮬2 д« Ј) ўлЇ®«пҐв «®ЈЁз®Ґ
ба ўҐЁҐ, ® ЎҐ§ а §«ЁзЁп § Ј« ўле Ё Їа®ЇЁбле ЎгЄў.
ЏаЁ¬Ґа:
(DEFUN STRING= (ATM1 ATM2 FLAG)
((AND (ATOM ATM1) (ATOM ATM2))
((NULL FLAG)
((if ATM1's print name is lexicographically
equal to ATM2's print name) T) )
((if ATM1's print name is lexicographically, by
ignoring case, equal to ATM2's print name) T) ) )
(STRING= 'FAST 'FASTER) --> NIL
(STRING= 100 |100|) --> T
(STRING= 'Fast 'FAST T) --> T
STRING< [atom1,atom2,flag] Function
STRING> [atom1,atom2,flag] Function
STRING<= [atom1,atom2,flag] Function
STRING>= [atom1,atom2,flag] Function
STRING/= [atom1,atom2,flag] Function
…б«Ё а-Ё¬п < ⮬ 1> «ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬ҐмиҐ, 祬 а-Ё¬п
< ⮬ 2>, (STRING< ⮬1 ⮬2) ў®§ўа й Ґв ®¬Ґа Ї®§ЁжЁЁ ЇҐаў®Ј®
бЁ¬ў®« , зЁ п б Є®в®а®Ј® а-Ё¬Ґ Ґ б®ўЇ ¤ ов; ў Їа®вЁў®¬
б«гз Ґ ® ў®§ўа й Ґв NIL. …б«Ё <д« Ј> Ґ а ўҐ NIL, (STRING<
⮬1 ⮬2 д« Ј) ўлЇ®«пҐв «®ЈЁз®Ґ ба ўҐЁҐ, ® ЎҐ§
а §«ЁзЁп § Ј« ўле Ё Їа®ЇЁбле ЎгЄў.
„агЈЁҐ дгЄжЁЁ в Є¦Ґ ўлЇ®«пов «ҐЄбЁЄ®Ја дЁзҐбЄ®Ґ ба ўҐЁҐ
Ё ў®§ўа й ов Ё«Ё NIL. Ё«Ё ®¬Ґа Ї®§ЁжЁЁ ЇҐаў®Ј® Ґб®ўЇ ¤ о饣®
бЁ¬ў®« ў а-Ё¬Ґ е. STRING> ба ўЁў Ґв а-Ё¬Ґ >, STRING<= -
<=, STRING>= - >=, STRING/= - Ґ а ў®.
ЏаЁ¬Ґа:
(DEFUN STRING< (ATM1 ATM2 FLAG)
((AND (ATOM ATM1) (ATOM ATM2))
((NULL FLAG)
((if ATM1's print name is lexicographically
less than ATM2's print name)
(the position of the first mismatch)) )
((if ATM1's print name is lexicographically, by
ignoring case, less than ATM2's print name)
(the position of the first mismatch)) ) )
(STRING< 'DOG 'CAT) --> NIL
(STRING< 'CAT 'DOG) --> 0
(STRING< 'DOG 'DOGGY) --> 3
(STRING<= 'DOG 'DOG) --> 3
(STRING/= 'DOG 'DOG) --> NIL
Соседние файлы в папке Filp