������ 2
���������� ������� � ˳��
����� � ����������� ��������� ������ �������� �������, ��������� ������������.
������� ����������� ������� ��������� � ������� ����� ��������. ���������� �������
� ˳�� �� ��������� ������:
(DEFUN name (arg1 arg2 ...)
task1
task 2
. . . . . )
�� name � ��� �������, arg1, arg2, ... � ��������� (���������). ҳ�� ������� ������
������������ �����. ������� ����� DEFUN ������� � DEfine FUNction.
$ (DEFUN FIRST (lst) $ (FIRST �(q w e r t y))
(CAR lst) ) q
$ (DEFUN THIRD (lst) $ (THIRD �(q w e r t y))
(CADDR lst) ) e
��������� ������� NULL, ��� ������� �������� ������. ���� ������� ������, ���� ��
���������� � �������� ������ � �������� � ������ �������.
$ (DEFUN NULL (obj) $ (NULL �(q w e r)) $ (NULL (CDR �(r)))
(EQL obj NIL) ) F T
��� ��� ���� ��� ������� ����������: EQL, ATOM, NULL. �������, �� ��������������
��� �������� ������ ���� �� ������ ��������� ���� ��� �������� � ������ �� ����,
����������� �����������.
ҳ�� ������� ���������� � ����������� �������. �������� ������ ����
���� ����: ����� �� ��������. ����-��� �������� �������� � ����� ����� � ����
������������ �� ������ ������, �� ����� ����������������.
���� �������� � ������ ��� ���� ������ ������� � ������, �� ���� �������� ����������
�������. ���������, (CONS �NR LST).
���� ������ ������� ������, ���� ����� �������� �� � ������, �� ���� �������� ����������
�������. ���������, ((ATOM lst) (CONS expr lst)).
� �������� �������� ������ ������� ������ ���������� � ����������. ���� ��������
��������� NIL, �� �������� �������� ��� ����� NIL � ˳�� ���������� �� ���������
���������� ��������. ���� �������� ������� �� NIL, ���������� ��������� ������
������ ��������, � ���� �������� �����������. ���� �������� ������� �, � ����
�������� ��������, �� ����������� � ������� ���� T.
�������� ��������, ���� ������� ������. ���� ���������� � ������, �� ��������
������� ������, ������ � ��������. ������� LISTP ����� ���������������� ���������
�����: "���� obj � ������, �� ��������� NIL, ������ ��������� T".
$ (DEFUN LISTP (obj) $ (DEFUN LISTP (obj)
((ATOM obj) NIL) ((NULL obj))
T ) ((ATOM obj) NIL)
T )
� ����� ������� �������� �������� LISTP, ���� ������� ��������� �������� ������
(������� ������). ����� �������� � �������, ���� ����� ��������. ���� �����
���������������� ���: ��������� �ᒺ�� obj �� �������� ������, � ���� �� � �����,
�������� �� ��������� ������� ������. ���� ������� ������: ((NULL obj) T), �������
�� �� � ����, �� � ((NULL obj)). �������� ��������� ��� ��������� � ���� �. ��
������, �� ���� ����� � ������� ������� �� �������� (���� �� ���� ����� ���������
��������� ���� �� ���������� ��������), �� �� ��������� ������� ��������� �. ���
������� ���������� ������� LISTP ����:
$ (LISTP �tree) $ (LISTP �()) $ (LISTP �(q w e r t y))
NIL T T
��� ������� �������� ������ ��� ������� �� ������� � ������� ������� ����������
������� sm �� ����������, �� ���� ���� ���������� ��� ������ ������� ���������:
$ (DEFUN sm (lst) $ (sm �()) $ (sm �(q w e))
((NULL lst) 10 1) 1 12
(SETQ b 2)
((CDR lst) 12) $ (sm �(i)) $ (sm �g)
(SETQ b 3) ) 3 3
�� ������, ���� ��������� �������� �������� ��������� ������ ���������� ����������
�������� (���� ���� �). ���� �������� �������� �������� ��������, �� ���������� ����
���� � ����������� ��������� ���������� ������ ������.
���������� ������� (LIST x1 ... xn) ������� �� ���� ������, ���������� ����� � x1,..., xn.
���� ��������� �� ������, ����������� ���� NIL.
$ (LIST �a �b �c �d) $ (LIST �a �(b c) �d) $ (LIST)
(a b c d) (a (b c) d) NIL
�������� ������� MEMBER, ��� �� ��� ���������: nam - ������ �� lst - ������ � ���
������� ��������� �� �������� ������ ������. ��������� ��������� �������� ������
� ������ ��������� ������, ���� � ������ ��������� � ��� ���. �������� � ������
�������� ������ � ����, �� �� �� ����� ������� ������� ������. � ���� �� � �����
�� �������, � ���� ���� ������, �� ��� ������� ���� ���� �������. ���� ������� ����
���� ��������� ����� ������ (������ ��������):
$ (DEFUN MEMBER (nam lst) $ (DEFUUN MEMBER (nam lst)
((EQL nam (FIRST lst))) ((NULL lst) NIL)
((EQL nam (SECOND lst))) ((EQL nam (CAR lst)) T)
((EQL nam (THIRD lst))) (MEMBER nam (CDR lst)) )
((EQL nam (THIRD (CAR lst))))
. . . . . . . . . . . . . . .
������ ��� ����� �� �������� �������. � ������� ��������� ���������� ������� MEMBER, �
����� ��� ������ ����������� �����, ���� �������� �� ��������� ������:
1. ���� ������ �������� (�� �� ��������), �� nam �� �������� ������.
2. ���� nam ������� ����� ������, �� nam �������� ������.
3. ���� nam �� ������� ����� ������, �� nam ���� �������� ������ ��� � ����� ��� ���� nam �������� ������ ������.
���������� �� ���������� �������: REMBER (REMove memBER), ��� �� ��� ��������� � ����
obj �� ������ lst � ��� ������� ����� ���������� ����� obj � ������ lst. REMBER-ALL ���
������� �� ����� obj � ������ lst.
$ (DEFUN REMBER (obj lst) (DEFUN REMBER-ALL (obj lst)
((NULL lst) NIL) ((NULL lst) NIL)
((EQL obj (CAR lst)) (CDR lst)) ((EQL obj (CAR lst))
(CONS (CAR lst) (REMBER-ALL obj (CDR lst))
(REMBER obj (CDR lst))) ) (CONS (CAR lst)
(REMBER-ALL obj (CDR lst))) )
��������� ������ ��� ������� ����������� �� ���������:
$ (REMBER �a �(q a w e r t a y)) $ (REMBER-ALL �a �(q a w e r t a y))
(q w e r t a y) (q w e r t y)
��������� ������� EQL ��������������� ��� ��������� �����. ����� ������ �������
���������� ������. �������� ������� EQLIST, ��� ������� ������. �� �������� �� �����
��������� �����:
1. ���� ������ ������ ��������, ��, ���� � ������ ������ ��������, ��������� �, ������ ��������� NIL (��� ������ ��������� (NULL ������� ������)).
2. ���� ������ ������ ��������, ��������� NIL.
3. ���� ������ ������� ������ �� ������� ����� ������� ������, ��������� NIL.
4. ��������� ������� ������ ������� �� ������� ������.
$ (DEFUN EQLIST (lst1 lst2) $ (DEFUN NOT (obj)
((NULL lst1) (NULL lst2)) (EQL obj NIL) )
((NULL lst2) NIL)
((NOT (EQL (CAR lst1) (CAR lst2))) NIL)
(EQLIST (CDR lst1) (CDR lst2)) )
������� NOT ������� NIL, ���� ������ �� �������� � � ������.
���������� ������ �ᒺ������ ������. ������ ������� APPEND, ����������� ��� � ��� ������
lst1 �� lst2, ����� ������� ��������� �����:
1. ���� lst1 ��������, ��������� lst2.
2. ǒ������ ������ ������� ������ � �������, ���� �������� � ��������� �ᒺ������ ������ ������� ������ � ������ �������.
$ (DEFUN APPEND (lst1 lst2)
((NULL lst1) lst2)
(CONS (CAR lst1) (APPEND (CDR lst1) lst2)) )
������� (REVERSE lst1) ������ ������ lst1. ���� �������� ������ ��������, �� � �����������
���� �������� ������. ������ ��������� �ᒺ����� ��������� ���� ��������� ������ � ���� ������
���������. ������� �� ���� ������� ��������� ������� APPEND ������� ���������� ������,
��������� � ������� �������� ������ ������� ������, ���� ���������� ���� � �����. ��
������ ������� (CONS (CAR lst) NIL).
$ (DEFUN REVERSE (lst)
((NULL lst) NIL)
(APPEND (REVERSE (CDR lst)) (CONS (CAR lst) NIL)) )
�������� ������� REVERSE ��� ������������ ������� APPEND. ��� ����� �������� �������
REVERSE � ����� ����������� �� ������� ������� �����. �������� ������ � ���� �������.
���� �� ��������, �� � ������������ ���� ���� ��������. ������ ����� ������ � �������
����� � �������� ���� �� ������ ����. ������ ���� ��� ������� ������� ���� NIL:
(REVER list NIL).
$ (DEFUN REVER (lst1 lst2) $ (REVER �(q w e) NIL)
((NULL lst1) lst2) (e w q)
(REVER (CDR lst1) (CONS (CAR lst1) lst2)) )
���������� ������� muLisp
���������� muLisp ��� �������� ���� ������� ���������� � ��� �������� �� ����� ������
�������� �����, ������� ������ �� ���������� �������. ������� SAVE ������ �������
���������� muLisp � ������ SYS - �����. ������� (SAVE �C:HOME) ������ ���������� �
���� HOME.SYS �� ����� C. ϳ��� �������� ��������� ������� ������ ����������� �, ������
� NIL.
���������� muLisp ���� ���� ����������� �� ��������� ������� LOAD: (LOAD file).
���� ���� �� ��������, ����������� NIL, ������ ����� �������� �� �����������, � mulisp
������ ��������� � ����� �����������.
���������� ������� � muLisp
���� ������������� muLisp ��� ���������� �� �������� debug.lsp, ��� ����������� �
���������� ˳���. ��� ����, ��� ��������� ���������� ����-��� ������� ��������� ����
������� (TRACE-FUNCTION func). ���� ���� ����� ��������� ������� function, �� �� ������
������������ ���� ��������� �������. ������� (UNTRACE-FUNCTION func) ��������� ����������
������� func. ���� � �� ������� func ���� ������ ����� �������, � �� ������
�������� �� ����������, ��������� ��������� �� ����������. ����� func=value
� ���� ������ ��, �� ������� func ������� �������� value.
���������, ���� ������ (TRACE-FUNCTION APPEND) (APPEND �(q w e) (r t y u)) �� ������
������������ ����� (�������� ������ ��������, ���� � ������):
APPEND [(q w e) (r t y u)] APPEND = (r t y u)
APPEND [(w e) (r t y u)] APPEND = (e r t y u)
APPEND [(e) (r t y u)] APPEND = (w e r t y u)
APPEND [NIL (r t y u)] APPEND = (q w e r t y u)
���������� ����� ������� REVERSE � �������� ���������� ������� APPEND ��� ������
(REVERSE �(q w)) (�������� ������ ��������, ���� � ������):
REVERSE [(q w)] REVERSE = (w)
REVERSE [(w)] APPEND [(w), (q)]
REVERSE [NIL] APPEND [NIL, (q)]
REVERSE = NIL APPEND = (q)
APPEND [NIL, (w)] APPEND = (w q)
APPEND = (w) REVERSE = (w q)
��������
I ������ �������
1. �������� �������, ��� ���������:
| a) ����� ������� ���������� �������� | �) �������� ���� �������� ������
|
| �) ������ ������� ������� �������� | �) �������� ���� ������ � ����������
|
| �) ������ ���� ������ � ���������� | �)�������� ���������� �������� �� ������
|
2. �������� ������� REVERSE, �� �������������� ������� ��������� �� ������������.
�������: ������������ ������� PUSH �� POP.
3. �������� �������, ���:
| �) � ��������� ������ ������ ������� | �) ��������� ������ ���� ������
|
| �) �ᒺ��� �� ������� | �) ��������� ������� ���� ������
|
II ������ �������
1. �������� �������:
�) (REVERSE lst), �� lst� ������ � ����������. ������� ������� ��������� �� ��� ����� ������ lst.
$ (reverse_all '(1 2 3 (q w e (r t) y) 7 9))
(9 7 (Y (T R) E W Q) 3 2 1)
�) (FIND_NEIGHBOURS lst node), �� lst � ������ ����� ����� (����� ����� � ������� � ���� ����� � ������ ������), node � ����� �������. ������� ������� ��������� ������ ������, ������� � �������� node. ���� ������� ������������.
$ (find_neighbours '((1 2) (3 1) (4 5) (9 1) (2 3) (1 5)) 1)
(2 3 9 5)
�) (LINER lst), �� lst � ������ � ����������. ˳���������� ������ lst.
$ (liner '(3 (q w e r (t) () y ) 4 (5) o (p () )))
(3 Q W E R T Y 4 5 O P)
�) (SYMDIFF lst1 lst2), �� lst1 �� lst2 � �������. ��������� �� ���������� ������.
$ (symdiff '(2 3 4 5) '(3 41 1 5))
(2 4 41 1)