������ 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)