
рдкрд░рд┐рдЪрдп
рдореЗрд░реА рд╡рд┐рдирдореНрд░ рд░рд╛рдп рдореЗрдВ,
рд▓рд┐рд╕реНрдк рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдХ рд░рддреНрди рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ (1958) рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдпрд╣ рдЕрднреА рднреА рд╡рд┐рд╕реНрдорд┐рдд рдХрд░рдирд╛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдЕрдкрдиреЗ рд╕рдордп рд╕реЗ рдЗрддрдирд╛ рдЖрдЧреЗ рдирд┐рдХрд▓ рдЪреБрдХрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХрд╛ рдШрдВрдЯрд╛ рдмрд╕ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рд░рд╣рд╛ рд╣реИред
рддреЛ рдЖрдЗрдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд▓реЗрдЦ рдХрд╛ рдирд╛рдо рд╣реИ, рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рд╣реА рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ
рдХреЙрдорди рд▓рд┐рд╕реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╛ рдЗрд╕рдХреЗ
рдПрд╕рдмреАрд╕реАрдПрд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХрд╛ред
рдиреЛрдЯ: рдпрджрд┐ рдЖрдк рд╢реБрджреНрдз рдПрд╕рдмреАрд╕реАрдПрд▓ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рдмрд╛рдж stdio рд╕реНрдЯреНрд░реАрдо рдХреЛ рдлреНрд▓рд╢ рди рдХрд░реЗрдВ, рдореИрдВ рдЦреБрдж Emacs рдФрд░ Slime рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ SBCL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдРрд╕реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдЕрднреА рддрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИредрдХреИрд╕реЗ?
рд▓рд┐рд╕реНрдк рдореЗрдВ рдЕрджреНрднреБрдд рдЧреБрдг рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдмреАрдЪ рдореИрдВ рдХреЛрдб рдХреА рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдФрд░ рдПрдХрд░реВрдкрддрд╛ рдХреЛ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рд▓рд┐рд╕реНрдк рдХреЛрдб рдЗрд╕рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╣реИ, рдФрд░ рдХрдИ рдбреЗрдЯрд╛ рдХреЛрдб рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдСрдЯреЛ-рдПрдкреЗрд░реЗрдЯрд┐рд╡ (рдЦреБрдж рдкрд░ рд▓рд╛рдЧреВ) рдФрд░ рдСрдЯреЛ-рд░реЗрдкреНрд▓рд┐рдХреЗрдЯрд┐рд╡ (рдЦреБрдж рдХреЛ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛) рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛
рдпрд╣рд╛рдБ рд▓рд┐рдЦрд╛ рдЧрдпрд╛
рд╣реИ ; рдЬрд╛рдирдХрд╛рд░реА, рдмрджрд▓реЗ рдореЗрдВ, "рдж рд╡рд░реНрд▓реНрдб рдСрдл рд▓рд┐рд╕реНрдк" (рдИред рд╣реНрдпреВрд╡реЗрди, рдЖрдИред рд╕реЗрдкреНрдпрд╛рдиреЗрди) рдЦрдВрдб 1, рдкреГрд╖реНрда 280 рд╕реЗ рд▓реА рдЧрдИ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдХреНрд╡реАрди , рдЬреЛ рдХрд┐ рдСрдЯреЛ-
рдРрдкреНрд▓рд┐рдХреЗрдЯрд┐рд╡ рдФрд░ рдСрдЯреЛ-рд░реЗрдкреНрд▓рд┐рдХреЗрдЯрд┐рд╡ рджреЛрдиреЛрдВ рд╣реИ, рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:
((lambda (x) (list x (list 'quote x))) '(lambda (x) (list x (list 'quote x))))
рдЬрдм рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдпрд╣ рд╕реНрд╡рдпрдВ рдХреЛ рдШрдЯрд╛рддрд╛ рд╣реИред
рдФрд░ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЦреБрдж рдХреА рдПрдХ рд╕рдЯреАрдХ рдкреНрд░рддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдирдП рд╕рдВрд╕реНрдХрд░рдг, рдЬреЛ рдмрд╛рдж рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рднреА рдЕрдзрд┐рдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП? рддреЛ рдЪрд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
рдХрдорд╛рдВрдб рдкреНрд░реЛрд╕реЗрд╕рд░
рдЖрджреЗрд╢ рдореЗрдВ рд╣реЛрд╢ рдореЗрдВ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╡рд╛ рд╣рд┐рд▓рд╛ рдФрд░ рдПрдХ рд╡реИрдХреНрдпреВрдо рдореЗрдВ рдЧреЛрд▓рд╛рдХрд╛рд░ рдШреЛрдбрд╝реЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЪрд▓реЛ рдПрдХ рдЫрджреНрдо рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╡рд┐рдХрд▓реНрдк рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рдХрдорд╛рдВрдб рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рдХрд╣рддрд╛ рд╣реИ, рдХреАрдмреЛрд░реНрдб рд╕реЗ рдПрдХ рдХрдорд╛рдВрдб, рд╣рдорд╛рд░реА рд░рдЪрдирд╛рддреНрдордХрддрд╛ рдХрд╛ рдЙрддреНрдкрд╛рдж рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╕рднреА рдирдордХ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╕реНрд░реЛрдд (рд╣рд░ рдЕрд░реНрде рдореЗрдВ) рдХреЛрдб рдмрд╣реБрдд рдиреНрдпреВрдирддрд░ рд╣реЛрдЧрд╛ред рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЗрд╕реЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдЦрд┐рд▓рд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЕрдм
REPL рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдкрд░ рдирд╣реАрдВ рд▓реМрдЯреЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рд╣рдорд╛рд░реА рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдФрд░ рд╡рд┐рдХрд╕рд┐рдд (рдпрд╛ рдиреАрдЪрд╛) рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рддреЛ, рдЪрд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рджреЗрддрд╛ рд╣реИ, рдЬреЛ
рд▓реИрдореНрдмрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ, рдЬреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрдб рд╣реИред рдпрд╣ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЛрдб рднреА рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдирд┐рдпрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
(defun start-program () '(lambda (program) (princ "$> ") (let ((input (read))) (when (listp input) (let ((command (car input))) (cond ((eq command 'code) ; = code, (setf program ; (funcall ; , (eval (list 'lambda '(program input) (cadr input))) program input) ) ) (t (format t "Unknown command ~A ~%" command)) ) ) ) program ) ) )
рд╣рдорд╛рд░рд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рдмрд╣реБрдд рдХрдо рдЬрд╛рдирддрд╛ рд╣реИред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреАрдмреЛрд░реНрдб рд╕реЗ
рдПрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдкрдврд╝рддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдПрдХ рд╕реВрдЪреА рд╣реИ, рддреЛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рдХрдорд╛рдВрдб рдХрд╛ рдирд╛рдо рд╣реИ, рдмрд╛рдХреА рдЗрд╕рдХреЗ рддрд░реНрдХ рд╣реИрдВред рдЖрдЙрдЯ-рдСрдл-рдж-рдмреЙрдХреНрд╕ рдХрдорд╛рдВрдб рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реА "рдХреЛрдб" рдХрдорд╛рдВрдб рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрдорд╛рдВрдб рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдФрд░ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдПрдХ рд▓рдВрдмреЛ рдлрдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИред рдЗрддрдиреА рдореЗрд╣рдирдд рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ eval рдПрдХ рд╢реВрдиреНрдп рд╢рд╛рдмреНрджрд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЕрдкрдиреА рдЧрдВрджреА рдЪрд╛рд▓реЗрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рдЗрдирдкреБрдЯ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рдпрд╣ рдореЗрд░реЗ рд╕рд╛рде рдШрдЯрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдордиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрд░реАрдХреЗ рд╣реИрдВред рдЖрдВрддрд░рд┐рдХ рдирд┐рд╖реНрдХрд╛рд╕рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд░ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рдХреЗрд╡рд▓ рд╢реЗрд╖ рдЗрдирдкреБрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдХреЛрдб рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рджред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд
рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрдХреНрд░ рдХрд╛ рдЖрдпреЛрдЬрди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╕рднреА рдЬрд╛рджреВ рд▓реБрдЯрд╛рддреЗ рд╣реИрдВред
(defun main () (let ((program (start-program)))

рдЗрд╕рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдо (рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡реЗрд░рд┐рдПрдмрд▓) рдЦрд╛рд▓реА рд╣реЛрдиреЗ рддрдХ рд▓реВрдк рдЪрд╛рд▓реВ рд░рд╣рддрд╛ рд╣реИред рд╢реВрдиреНрдп рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо
рд╕реНрдЯрд╛рд░реНрдЯ-рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдФрд░ рдЧреИрд░-рд╢реВрдиреНрдп рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рд╣рдо рдЗрд╕реЗ (рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд░) рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреИрд░рд╛рдореАрдЯрд░ (рдлрд┐рд░ рд╕реЗ) рдХреЗ рд╕рд╛рде рдЗрд╕рдореЗрдВ рдирд┐рд╣рд┐рдд рдлрд╝рдВрдХреНрд╢рди (рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд░) рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдпрд╣ рдПрдХ рддрдирд╛рддрдиреА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдкрддрд╛ рдЪрд▓рд╛? рдЕрдм
REPL- рдореБрдЦреНрдп рдореЗрдВ
рдЪрд▓рд╛рдПрдВ рдФрд░ рдкреНрд░реЙрдореНрдкреНрдЯ рджреЗрдЦреЗрдВ:
CL-USER> (main) $>
рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдердХ рдЧрдП рд╣реИрдВ рдФрд░
рдЖрд░рдИрдкреАрдПрд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдирдЖрдИрдПрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЕрдм рддрдХ рд╣рдорд╛рд░реЗ рдПрдХрдорд╛рддреНрд░ рдХреЛрдб рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдпрд╣ рд╕реНрд░реЛрдд рдкрд╛рда рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рдмрджрд▓ рджреЗрдЧрд╛, рдФрд░ рд▓реВрдк рдЗрд╕реЗ рд╕рдорд╛рдкреНрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрднреА рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЕрдм рд╕реЗ, рд╕рднреА рдЯреАрдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░ рдЪреБрдХреА рд╣реИрдВред рдирдХрд▓ рдХреА рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдореИрдВ рдЕрдХреНрд╕рд░ "$>" рдХреЛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
рд╡рд░реНрддрдорд╛рди рдЪрд░рдг рдореЗрдВ, рд╣рдорд╛рд░реЗ рдХрдорд╛рдВрдб рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрдард┐рди рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╣рдореЗрдВ рдХреЛрдб рдХрдорд╛рдВрдб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ рдирдП рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред рдЪрд▓рд┐рдП рдПрдХ рдРрд╕реА рдЗрд▓ рдХрдорд╛рдВрдб рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреА рд╣реИред рд╡рд╣ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
(code '(lambda (program) (princ "$> ") (let ((input (read))) (when (listp input) (let ((command (car input))) (cond ((eq command 'code) (setf program (funcall (eval (list 'lambda '(program input) (cadr input))) program input))) ((eq command 'eval) (eval (cadr input))) ; (t (format t "Unknown command ~A ~%" command)) ) ) ) program ) ) )
рд╢рд╛рдпрдж рдпрд╣ рд╕реНрдЯрд╛рдЗрд▓-рдЪреЗрддрд╛рд╡рдиреА рджреЗ рджреЗрдЧрд╛, рдпрд╣ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
$> (eval (print (+ 3 2))) 5 $>
рд╡реЛрдЗрд▓рд╛, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!
рд╕реАрдЬрд╝рди рд╕рд┐рд╕реНрдЯрдо рддреАрди рдХрд╛рд░реНрдпреЛрдВ (rsubs, rrem, rins) рдХреЗ рд╕рд╛рдеред
rsubs (рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди) рдкреБрд░рд╛рдиреЗ рдлреЙрд░реНрдо (рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкреБрд░рд╛рдиреЗ) рдХреЛ рдирдП (рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдирдП) рдХреЗ рд╕рд╛рде рдлреЙрд░реНрдо (рддреАрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдлреЙрд░реНрдо) рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рддрд╛ рд╣реИред
rrem (рд░рд┐рдХрд░реНрд╕рд┐рд╡ рд░рд┐рдореВрд╡) рдлреЙрд░реНрдо (рдХрд┐рд╕ рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░) рдлреЙрд░реНрдо рд╕реЗ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ (рдлреЙрд░реНрдо рдХрд╛ рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░) рднреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реИред рдЕрдВрдд рдореЗрдВ, рдлрд╛рд░реНрдо (рддреАрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдлреЙрд░реНрдо) рдкрд░ рдлреЙрд░реНрдо (рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрдпрд╛) рдХреЗ рдмрдЧрд▓ рдореЗрдВ
рд░рд┐рдВрд╕ (рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЖрд╡реЗрд╖рдг) рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдХреБрдВрдЬреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреА рдЬрд╛рддреА рд╣реИ: рдЯреА рд╕реЗ рдкрд╣рд▓реЗ, рддреЛ рдЗрдВрд╕рд░реНрдЯ рдлреЙрд░реНрдо рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ, рдЕрдиреНрдпрдерд╛ - рдЗрд╕рдХреЗ рдмрд╛рдж - рдЖрдкрдХреЛ рддреАрди рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред
рддреАрди рдЯреАрдореЗрдВ рджреЗрдЦреЗрдВ (eval (defun rsubs (old new form) (cond ((atom form) (if (equal form old) new form)) ((equal form old) new) (t (loop for el in form collect (rsubs old new el))) ) ) ) (eval (defun rrem (what form) (cond ((atom form) (if (equal what form) nil form)) (t (loop for el in form if (not (equal what el)) collect (if (listp el) (rrem what el) el) )) ) ) ) (eval (defun rins (where what form &key before) (cond ((atom form) form) (t (loop for el in form append (if (equal el where) (if before (list what el) (list el what)) (if (listp el) (list (rins where what el :before before)) (list el) ) ) )) ) ) )
рдкрд╣рд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рддрд░реАрдХреЗ рд╕реЗ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдирдП рдХрдорд╛рдВрдб рдЬреЛрдбрд╝рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЗрд╡рд▓ рдХреЛрдб рдХреЛ рдЕрдкрдиреЗ рддрд░реНрдХ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреВрд░реНрд╡-рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рджреГрд╢реНрдп рдХрдорд╛рдВрдб рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдХрдорд╛рдВрдбред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдВрдбреЛрдо рдкрд░рдорд╛рдгреБ рдХреЗ рдмрд╛рдж рдирдпрд╛ рдХреЛрдб рдпрд╣рд╛рдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред
(code (rins 'cond '((eq command 'view) (progn (format t "---code---") (print program) (terpri))) program))
рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:
рдХрдорд╛рдВрдб рдЖрдЙрдЯрдкреБрдЯ рдЙрджрд╛рд╣рд░рдг (рджреЗрдЦреЗрдВ) $> (view) ---code--- (LAMBDA (PROGRAM) (PRINC "$> ") (LET ((INPUT (READ))) (WHEN (LISTP INPUT) (LET ((COMMAND (CAR INPUT))) (COND ((EQ COMMAND 'VIEW) (PROGN (FORMAT T "---code---") (PRINT PROGRAM) (TERPRI))) ((EQ COMMAND 'CODE) (SETF PROGRAM (FUNCALL (EVAL (LIST 'LAMBDA '(PROGRAM INPUT) (CADR INPUT))) PROGRAM INPUT))) ((EQ COMMAND 'EVAL) (EVAL (CADR INPUT))) (T (FORMAT T "Unknown command ~A ~%" COMMAND))))) PROGRAM)) $>
рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдЕрдм рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдЯреАрдо рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рдЯреАрдореЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдЧреАред рдЕрдЪреНрдЫрд╛, рдЗрд╕реЗ рдФрд░ рдХреИрд╕реЗ рдХрд╣реЗрдВ? рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдЧрд╛:
(рдРрдб-рд╕реАрдПрдордбреА рдирд╛рдо-рдирдпрд╛-рдХрдорд╛рдВрдб what-she-will-do) ред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╡рд┐рдХрдЯ рд╕реНрдерд┐рддрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ рдХрдВрдбреЛрдо рдкрд░рдорд╛рдгреБ рдХреЗ рдмрд╛рдж рдирдИ рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдХреЛрдб рдбрд╛рд▓рд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдерд╛ред рдпрд╣ рдирд╛рдо рдЖрдо рд╣реИ, рдФрд░ рдпрджрд┐ рдкрд╛рда рдореЗрдВ рдЗрд╕рдХрд╛ рдПрдХ рдФрд░ рдЙрд▓реНрд▓реЗрдЦ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╣рд╛рдВ рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЫреВрдиреЗ рдирд╣реАрдВ рдЬрд╛ рд░рд╣реЗ рдереЗред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдорд╛рд░реНрдХрд░ рджрд░реНрдЬ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдирдП рдХрдорд╛рдВрдб рдбрд╛рд▓реЗрдВред рдорд╛рд░реНрдХрд░ рдПрдХ рдЕрд╕рдВрднрд╡ рд╕реНрдерд┐рддрд┐ рд╣реЛрдЧреА рдЬрд┐рд╕реЗ рд╣рдо рдХрдВрдбреЛрдо рдХреЗ рдмрд╛рдж рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
(code (rins 'cond '((eq t nil) 'secret-marker) program))

рд╣реЛ рдЧрдпрд╛ред рдЕрдм рд╣рдо рдЗрд╕ рдорд╛рд░реНрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдореНрдорд┐рд▓рди рд╕реНрдерд╛рди рдХреЛ рд░рд┐рдВрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рдорд╛рд░реНрдХрд░ рдХреА рднрд╛рд░реАрддрд╛ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рдЯреАрдо рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдЗрд╕реЗ рдЬрд╛рди рдЬрд╛рдПрдЧреА, рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рд╡реИрд╕реЗ, рдРрдб-рд╕реАрдПрдордбреА рдХрдорд╛рдВрдб рдХреЛрдб рдорд╛рд░реНрдХрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд░рд┐рдВрд╕ рдЗрд╕реЗ рдвреВрдВрдв рдФрд░ рддреЛрдбрд╝ рджреЗрдЧрд╛ред рдЖрдк рдорд╛рд░реНрдХрд░ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рдХреЗ рд░рд┐рдиреНрд╕ рдХреЛ рдореВрд░реНрдЦ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдЕрд▓рдЧ рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдбрд╛рд▓рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рд░рд┐рдиреНрд╕ рдЙрдирдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ)ред
рдПрдб-рдХрдорд╛рдВрдб-рдЯреВ-рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╝рдВрдХреНрд╢рди
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдПрдХ рдирдпрд╛ рдХрдорд╛рдВрдб рдХрдорд╛рдВрдб рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддрд╛ рд╣реИ:
(eval (defun add-command-to-program (program command action) (rins '((eq t nil) 'secret-marker)
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрдб-рд╕реАрдПрдордбреА рдХрдорд╛рдВрдб рдмрдирд╛рдПрдВред
(code (rins '((eq t nil) 'secret-marker)
рдЕрджреНрднреБрдд! рдЕрдм рдирдП рдЖрджреЗрд╢реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЖрд╕рд╛рди рдХреБрдЫ рдирд╣реАрдВ рд╣реИ (рдЙрдирдореЗрдВ рд╕реЗ рдЕрдВрддрд┐рдо рджреЛ рдЕрднреА рддрдХ рдирд╣реАрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИрдВ):
(add-cmd hi (princ "Hi, ")) (add-cmd quit (setf program nil)) (add-cmd reset (setf program (start-program)))
рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдЧреАред рдЙрдЪрд┐рдд рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЖрджреЗрд╢реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
(add-cmd save (with-open-file (stream (cadr input) :direction :output :if-exists :overwrite :if-does-not-exist :create) (print program stream))) (add-cmd load (setf program (with-open-file (stream (cadr input)) (read stream))))
рдЕрдм рд╣рдо рдЕрдкрдиреА рдЙрдкрд▓рдмреНрдзрд┐рдпреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рд╕реЗ рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ рдФрд░ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ; eval + defun рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреА рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдЗрд╕ рдХрд╖реНрдЯрдкреНрд░рдж рдЧрд▓рддрдлрд╣рдореА рдХреЛ рдареАрдХ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдм рдЗрд╕ рдкрд░ рд╕реНрдкрд░реНрд╢ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
$> (save "1.txt") $> (load "1.txt")
рдЕрдиреБрдХреВрд▓рди

рдПрдХ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдкрдиреЗ рд╕рдВрд╡рд╛рдж рдХреЗ рдЕрдиреБрдХреВрд▓рди рдореЗрдВ рд▓рдЧреЗ рд░рд╣реЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдордЬрд╝реЗрджрд╛рд░ рдЕрднрд┐рд╡рд╛рджрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
(eval (defun greeting () (let ((sentences (vector "My life for Ner'zhul. " "I wish only to serve. " "Thy bidding, master? " "Where shall my blood be spilled? " "I bow to your will. " ))) (elt sentences (random (length sentences))) ) ) )
рдЕрдм рдЙрдиреНрд╣реЗрдВ рд╢реЗрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
(code (rsubs '"$> " '(greeting) program))
рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдорд┐рд▓рддрд╛ рд╣реИ:
I bow to your will. (hi) Hi, I wish only to serve.
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдХреБрдЫ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХреЗ рд╕рд╛рде (рдкрдврд╝реЗрдВ) рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрд╖реНрдардХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ: рд╣рдо рдкрдВрдХреНрддрд┐ рдХреЛ рдкрдврд╝реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдЦреБрдж рдХреЛ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдлреНрд░реЗрдо рдХрд░реЗрдВрдЧреЗред
(code (rsubs '(read) '(read-from-string (concatenate 'string "(" (read-line) ")")) program))
рдкрд░рд┐рдгрд╛рдо:
Thy bidding, master? hi Hi, Where shall my blood be spilled?
рдЪрд▓реЛ рдЕрдВрдд рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо Thy bidding, master? view ---code--- (LAMBDA (PROGRAM) (PRINC (GREETING)) (LET ((INPUT (READ-FROM-STRING (CONCATENATE 'STRING "(" (READ-LINE) ")")))) (WHEN (LISTP INPUT) (LET ((COMMAND (CAR INPUT))) (COND ((EQ T NIL) 'SECRET-MARKER) ((EQ COMMAND 'LOAD) (SETF PROGRAM (WITH-OPEN-FILE (STREAM (CADR INPUT)) (READ STREAM)))) ((EQ COMMAND 'SAVE) (WITH-OPEN-FILE (STREAM (CADR INPUT) :DIRECTION :OUTPUT :IF-EXISTS :OVERWRITE :IF-DOES-NOT-EXIST :CREATE) (PRINT PROGRAM STREAM))) ((EQ COMMAND 'RESET) (SETF PROGRAM (START-PROGRAM))) ((EQ COMMAND 'QUIT) (SETF PROGRAM NIL)) ((EQ COMMAND 'HI) (PRINC "Hi, ")) ((EQ COMMAND 'ADD-CMD) (SETF PROGRAM (ADD-COMMAND-TO-PROGRAM PROGRAM (CADR INPUT) (CADDR INPUT)))) ((EQ COMMAND 'VIEW) (PROGN (FORMAT T "---code---") (PRINT PROGRAM) (TERPRI))) ((EQ COMMAND 'CODE) (SETF PROGRAM (FUNCALL (EVAL (LIST 'LAMBDA '(PROGRAM INPUT) (CADR INPUT))) PROGRAM INPUT))) ((EQ COMMAND 'EVAL) (EVAL (CADR INPUT))) (T (FORMAT T "Unknown command ~A ~%" COMMAND))))) PROGRAM)) My life for Ner'zhul.
рдЗрд╕ рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдЖрдк рдЬрд┐рддрдирд╛ рдЪрд╛рд╣реЗрдВ рдЙрддрдирд╛ рдордЬрд╝реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рд▓реЗрдХрд┐рди рдЖрдЬ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╣реИред