рд▓рдВрдмреЛрджрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА

рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдиреЛрдЯ: рдпрд╣рд╛рдВ рдореВрд▓ред рдореВрд▓ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдпреЛрдЬрдирд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдХрдо рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рднрд╛рд╖рд╛ рдХреА рд╕рднреА рд╕реБрдВрджрд░рддрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред
UPD: рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджрд╛рдИрдВ рдУрд░ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред


рдпрджрд┐ рдЖрдк рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрдХреНрд╖ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЖрдБрдЦреЗрдВ рдмрдВрдж рдХрд░рддреЗ рд╣реИрдВ - рдЖрдХрд╛рд░, рд╡рдЬрди, рдореВрд▓реНрдп, рдЧрд░реНрдореА рдЖрджрд┐, рддреЛ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП? рдЖрдЗрдП рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░реЗрдВред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, LISP (рдпреЛрдЬрдирд╛) рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЛрдб рдХреНрдпрд╛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛, рддреЛ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:

(define x 10) (define (fy) (display x) (newline) (display y) (newline) ) (define gf) (f 1) (g 2) 

 var x = 10; var f = function(y) { console.log(x); console.log(y); } var g = f; f(1); g(2); 


рдпрд╣ рд▓реЗрдЦ рдорд╕реНрддрд┐рд╖реНрдХ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдХрд╕рд░рдд рд╣реИ, рди рдХрд┐ рдХреБрдЫ рдРрд╕рд╛ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рддрд░рд╣ рдПрдХ рдЧрд┐рдЯрд╛рд░рд╡рд╛рджрдХ рддрд░рд╛рдЬреВ рдмрдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡рд╣ рдХрднреА рдЕрд╕рд▓реА рдЧрд╛рдиреЗ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреЛ рд╕реНрдЯреНрд░реЗрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдЬреЛ рдлрд╝рд░реНрд╕реНрдЯ-рдХреНрд▓рд╛рд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рд▓реЗрдХреНрд╕рд┐рдХрд▓ рд╕реНрдХреЛрдк (рдХреНрд▓реЛрдЬрд╝рд░, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ) рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред

рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реА рдЪреАрдЬреЗрдВ рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ (рд╢рд╛рдпрдж SICP рдпрд╛ рдж рд▓рд┐рдЯрд┐рд▓ рд╢реЗрдорд░ рдореЗрдВ), рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреБрдЫ рдирдпрд╛ рдХрд░рдиреЗ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдХреЛрдб рдкрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдЧрд░ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрд╡рд╛рджрд┐рд╖реНрдЯ рд╣реИред рдкрд╣рд▓реА рдмрд╛рд░, рд╕рдм рдХреБрдЫ рдмреЗрд╣рдж рдЕрдЬреАрдм рд▓рдЧреЗрдЧрд╛ред рдзреАрд░реЗ-рдзреАрд░реЗ рд╣рдЯреЛред рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЕрдЧрд▓реЗ рднрд╛рдЧ рдкрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВред рдпрд╣рд╛рдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╕рд╣рдЬ рдирд╣реАрдВ рд▓рдЧ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдмрд╣реБрдд рд╕рд░рд▓ рднрд╛рдЧреЛрдВ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реИрдВред

рдФрд░ рдЕрдВрдд рдореЗрдВ: рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЬрдЧрд╣ рдлрдВрд╕ рдЧрдП рд╣реИрдВ, рддреЛ рдирд┐рд░рд╛рд╢рд╛ рди рдХрд░реЗрдВред рдХрд╛рдЧрдЬ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдпрд╣ рд╕рдордЭрдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдореИрдВ рдЖрд░рд╛рдорджрд╛рдпрдХ рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреЛрд░реНрдЯреЗрдмрд▓ рдбреЗрд╕реНрдХ рдЦрд░реАрджрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ)ред рдпрджрд┐ рдпрд╣ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдмрд╕ рд▓реЗрдЦ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рдФрд░ рдХрд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВред рдХрднреА-рдХрднреА рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдЕрдкрдирд╛ рд╕реНрдерд╛рди рдЦреЛрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ рдереЛрдбрд╝рд╛ рднрдЯрдХрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред



1 рд╕реВрдЪреА



рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ! рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдбреЗрдЯрд╛ рдЧреНрд░реБрдкрд┐рдВрдЧ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реНрдХреАрдо рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди рд▓рд┐рд╕реНрдЯ рд╣реИрдВ (рдЕрдиреНрдпрдерд╛ рдпрд╣ LISP рдирд╣реАрдВ рд╣реЛрдЧрд╛;):

 (define names (list "Alice" "Bob" "Candice")) 

 var names = ["Alice", "Bob", "Candice"]; 


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╕реНрдХреАрдо рдореЗрдВ рдХреЛрдИ рд╕реВрдЪреА рди рд╣реЛ? рдХреНрдпрд╛ рд╣рдо рдЙрдиреНрд╣реЗрдВ, рдпрд╛ рдЙрдирдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЙрди рдЪреАрдЬреЛрдВ рдХреЗ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рдПрдХ рд╕реВрдЪреА рдХреА рддрд░рд╣ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЪрд╛рд░ рдЪреАрдЬреЗрдВ рдЪрд╛рд╣рд┐рдП:



рдЕрдЧрд░ рдпреЗ рдЪрд╛рд░ рдЪреАрдЬреЗрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЖрдЗрдЯрдо рд╕реЗ рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рдЖрдЗрдЯрдо рдХреЛ рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрди рдЪрд╛рд░ рднрд╛рдЧреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ - рдореИрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдпреЗ рд░рд╣рд╛ рдЙрдирдХрд╛ рд╕реНрдХреЗрдЪ:

 (define empty_list '()) (define (prepend el lst) ...) (define (head lst) ...) (define (tail lst) ...) (define (is_empty lst) ...) 
 var empty_list = null; var prepend = function(el, list) { // ... }; var head = function(list) { // ... }; var tail = function(list) { // ... }; var is_empty = function(list) { // ... }; 

рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рд╡рд░реНрдгрди рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

empty_list рд╢реВрдиреНрдп рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореВрд▓реНрдп рд╣реИред рдпрд╣ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпреЛрдЬрдирд╛ рд╕реЗ рдорд╛рдирдХ '() рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗред

(prepend 1 some_list) рдПрдХ рдирдИ рд╕реВрдЪреА рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рдЕрдкрдиреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдбрд╛рд▓реЗ рдЧрдП 1 рд╕рд╛рде рдкреБрд░рд╛рдиреЗ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рд╕рдВрдЦреНрдпрд╛ 1 рдФрд░ 2 рдХреА рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (prepend 1 (prepend 2 empty_list)) , рдпрд╛ "рдЦрд╛рд▓реА рд╕реВрдЪреА рдореЗрдВ 1 рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ 2 рдЬреЛрдбрд╝реЗрдВ"

(head some_list) рд╕реВрдЪреА рдореЗрдВ рдкрд╣рд▓рд╛ рдЖрдЗрдЯрдо рд▓реМрдЯрд╛рдПрдЧрд╛ред рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рд╕реЗ head рдкрд░рд┐рдгрд╛рдо рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ!

(tail some_list) рдПрдХ рдирдИ рд╕реВрдЪреА рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЗ рдмрд┐рдирд╛ рдкреБрд░рд╛рдиреЗ рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИред рдлрд┐рд░ рд╕реЗ, рдЦрд╛рд▓реА рд╕реВрдЪреА рд╕реЗ рдХреЙрд▓рд┐рдВрдЧ tail рд╕рдм рдХреБрдЫ рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрдЧрд╛ред

(is_empty some_list) #t рдХреЛ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдпрд╣ рд╕реВрдЪреА рдЦрд╛рд▓реА рд╣реИ рдФрд░ #f рдЕрдиреНрдпрдерд╛ред

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпреЗ рдЪрд╛рд░ рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ (рд╕рд╛рде рд╣реА рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрд░реНрде), рд╣рдо рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪреАрдЬреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП!

1.1 If рд╕реЗ рд╕реВрдЪреА


рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк cdr , car рдФрд░ cdr рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓реЗрдЦ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдпреЛрдЧ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП, рдЪрд▓реЛ рднрд╛рд╖рд╛ рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рдпрджрд┐ рдЗрд╕реЗ рдЯрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдо рднрд╛рд╖рд╛ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рд░рд╣ рдЧрдпрд╛ рд╣реИ? рдЦреИрд░, рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди (рдФрд░ '() ) рд╣реИрдВ, рддреЛ рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рдЖрдЬрд╝рдорд╛рдПрдВ!

рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 (define empty_list '()) (define (prepend el lst) (lambda (command) (if (equal? command "head") el (if (equal? command "tail") lst ) ) ) ) (define (head lst) (lst "head") ) (define (tail lst) (lst "tail") ) (define (is_empty lst) (equal? lst empty_list) ) 
 var empty_list = null; var prepend = function(el, list) { return function(command) { if (command === "head") { return el; } else if (command === "tail") { return list; } } }; var head = function(list) { return list("head"); }; var tail = function(list) { return list("tail"); }; var is_empty = function(list) { return list === null; }; 

рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд╕реНрдХреАрдо рджреБрднрд╛рд╖рд┐рдпрд╛ рдореЗрдВ рдЗрд╕реЗ рдЪрд┐рдкрдХрд╛рдПрдБ рдФрд░ рдЪрд╛рд░реЛрдВ рдУрд░ рдЦреЗрд▓реЗрдВ:

 (define e empty_list) (display (is_empty e)) ; #t (define names (prepend "Alice" (prepend "Bob" (prepend "Candice" empty_list ) ) ) ) (display (is_empty names)) ; #f (display (head names)) ; Alice (display (tail names)) ; Some function representing the list of ("Bob", "Candice") (display (head (tail names))) ; Bob 
 var e = empty_list; console.log(is_empty(e)); // true var names = prepend("Alice", prepend("Bob", prepend("Candice", empty_list))); console.log(is_empty(names)); // False console.log(head(names)); // Alice console.log(tail(names)); // Some function representing the list of ("Bob", "Candice") console.log(head(tail(names))); // Bob 


1.2 рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рдЧрдпрд╛?


рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдиреЗ рдЖрдкрдХреЛ рдЪреМрдВрдХрд╛ рджрд┐рдпрд╛? рд╕реВрдЪреА рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг, рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рддрд░рд╣ рд▓рдЧрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХрд╛рд░реНрдп рд╣реИрдВ!

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, "рдЦрд╛рд▓реА рд╕реВрдЪреА" рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдмрд╣реБрдд рд╕реАрдзреА рд╣реИ:

 (define empty_list '()) (define (is_empty lst) (equal? lst empty_list) ) 
 var empty_list = null; var is_empty = function(list) { return list === null; }; 


рдЖрдк рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред '() рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

рдЕрдм рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг prepend : рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ред

 (define (prepend el lst) (lambda (command) (if (equal? command "head") el (if (equal? command "tail") lst ) ) ) ) 
 var prepend = function(el, list) { return function(command) { if (command === "head") { return el; } else if (command === "tail") { return list; } } }; 


рдпрд╣реАрдВ рдкрд░ рд╕рд╛рд░рд╛ рдЬрд╛рджреВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рд╕реЛрдЪрддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рд╣рдо рд╕реВрдЪреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдХреБрдЫ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ (рдирдИ) рд╕реВрдЪреА рд╡рд╛рдкрд╕ рдорд┐рд▓рддреА рд╣реИред рддреЛ prepend рдХрд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди рдПрдХ рд╕реВрдЪреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ prepend рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИред рддреЛ, рд╣рдорд╛рд░реЗ рдЫреЛрдЯреЗ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рдпреЛрдЧ рдореЗрдВ, рдПрдХ рд╕реВрдЪреА рд╕рд┐рд░реНрдл рдПрдХ (рд▓рдВрдмреЛ-) рдпреЛрдЬрдирд╛ рдХрд╛рд░реНрдп рд╣реИ!

рддреЛ рд╣рдореЗрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╢реВрдиреНрдп рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИ)? рдЦреИрд░, рд╣рдореЗрдВ рд╕рд┐рд░ рдФрд░ рдкреВрдВрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрдм рд╣рдо рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ (prepend ht) , рд╣рдо рд╕рд┐рд░реНрдл рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рд░ рдФрд░ рдкреВрдВрдЫ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ! рдЗрд╕рд▓рд┐рдП, prepend рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдкрд░ рдЙрд╕рдХреЗ рд╕рд┐рд░ рдпрд╛ рдкреВрдВрдЫ рдХреЛ рдХреИрд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рддреЛ, рдПрдХ "рд╕реВрдЪреА" рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ "рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдорд╛рдВрдЧ рдкрд░ рдЕрдкрдирд╛ рд╕рд┐рд░ рдпрд╛ рдкреВрдВрдЫ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред" рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ head рдФрд░ tail рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреВрдЫрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП!

 (define (head lst) (lst "head") ) (define (tail lst) (lst "tail") ) 
 var head = function(list) { return list("head"); }; var tail = function(list) { return list("tail"); }; 


рд╡рд╣ рд╕рдм рд╣реИ! рд╣рдордиреЗ рдХреБрдЫ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреЛрдб рдХреА 24 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЖрдЧреЗ рдмрдврд╝реЗрдВ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдк рдХрд╛рдЧрдЬ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

1.3 рдЗрд╕ рдиреАрдВрд╡ рдкрд░ рдирд┐рд░реНрдорд╛рдг


рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реВрдЪрд┐рдпрд╛рдВ рд╣реИрдВ, рддреЛ рдЖрдЗрдП рдЙрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдЪреАрдЬреЛрдВ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

рдирдХреНрд╢рд╛


рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреБрд░рд╛рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдкрд┐рдВрдЧ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдмрдирд╛рдирд╛ рд╣реИред рдЗрд╕реЗ map рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

 (define (map fn l) (if (is_empty l) empty_list (prepend (fn (head l)) (map fn (tail l))) ) ) 
 var map = function(fn, l) { if (is_empty(l)) { return empty_list; } else { return prepend(fn(head(l)), map(fn, tail(l))); } }; 


рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреБрдЫ рдорд┐рдирдЯ рдмрд┐рддрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдкреЗрдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

 (define (square x) (* xx)) (define numbers (prepend 1 (prepend 2 (prepend 3 empty_list)))) (define squared_numbers (map square numbers)) ; (map square (1 2 3)) ; (prepend (square 1) (map square (2 3)) ; (prepend (square 1) (prepend (square 2) (map square (3)))) ; (prepend (square 1) (prepend (square 2) (prepend (square 3) (map square '())))) ; (prepend (square 1) (prepend (square 2) (prepend (square 3) '()))) ; (prepend (square 1) (prepend (square 2) (prepend 9 '()))) ; (prepend (square 1) (prepend (square 2) (9))) ; (prepend (square 1) (prepend 4 (9))) ; (prepend (square 1) (4 9)) ; (prepend 1 (4 9)) ; (1 4 9) 
 var square = function(x) { return x * x; } var numbers = prepend(1, prepend(2, prepend(3, empty_list))); var squared_numbers = map(square, numbers); // map(square, [1, 2, 3]) // prepend(square(1), map(square, [1, 2, 3])) // prepend(square(1), prepend(square(2), map(square, [3]))) // prepend(square(1), prepend(square(2), prepend(square(3), map(square, [])))) // prepend(square(1), prepend(square(2), prepend(square(3), []))) // prepend(square(1), prepend(square(2), prepend(9, []))) // prepend(square(1), prepend(square(2), [9])) // prepend(square(1), prepend(4, [9])) // prepend(square(1), [4, 9]) // prepend(1, [4, 9]) // [1, 4, 9] 


рдореИрдВ рдпреЛрдЬрдирд╛-рд╢реИрд▓реА рд╕реВрдЪреА ( (1 2 3) ) рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ prepend рд╕реЗ рд▓реМрдЯрд╛рдП рдЧрдП рдХрд╛рд░реНрдп рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЗрд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдП рд╣реИрдВ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░реЗрдВ (map square empty_list) рдФрд░ рдлрд┐рд░ рдирд┐рд╖реНрдкрд╛рджрди (map square (prepend 10 empty_list)) ред

рдЗрд╕ рд╢реИрд▓реА рдореЗрдВ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕реЛрдЪ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрднреНрдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдиреЛрдЯрдмрдВрджреА рдХрд╛ рдПрдХ рдЭреБрдВрдб рд╣реИ, рдЬреЛ рдЗрд╕ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИред рдЕрдиреБрднрд╡реА рдЧрд┐рдЯрд╛рд░рд╡рд╛рджрдХ рдирдИ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рд╕реАрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рд╡реГрджреНрдзрд┐ рдФрд░ рд╡рд┐рдирд╛рд╢ рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдХрд┐ рдпреЗ рдЪреАрдЬреЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рдЬрдмрдХрд┐ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдлрд┐рд▓реНрдЯрд░


рдЕрдм рд╣рдо рдереЛрдбрд╝рд╛ рддреЗрдЬ рдЪрд▓рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рднреА рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕рдордЭ рд▓реЗрдВред рдЖрдк рдЬрд┐рддрдирд╛ рдЪрд╛рд╣реЗрдВ рдЙрддрдирд╛ рд╕рдордп рдмрд┐рддрд╛рдПрдВ, рдХрд╛рдЧрдЬ рдкрд░ рд▓рд┐рдЦреЗрдВ, рдХреЛрдб рдЪрд▓рд╛рдПрдВ, рдЗрд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рдЕрдЧрд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╣рдо рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рдмрдирд╛рдПрдВрдЧреЗ рд╡рд╣ filter ред рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдПрдХ рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдореВрд▓ рдХреЗ рдЙрди рддрддреНрд╡реЛрдВ рд╕реЗ рдпреБрдХреНрдд рдПрдХ рдирдИ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди #t рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 (define numbers (prepend 1 (prepend 2 (prepend 3 empty_list)))) (define (is_odd x) (equal? (modulo x 2) 1)) (filter is_odd numbers) ; (1 3) 
 var numbers = prepend(1, prepend(2, prepend(3, empty_list))); var is_odd = function(x) { return x % 2 === 1; } filter(is_odd, numbers); // [1, 3] 



рдЕрдм рд╣рдо filter рд▓рд╛рдЧреВ filter :

 (define (filter fn l) (if (is_empty l) empty_list (if (fn (head l)) (prepend (head l) (filter fn (tail l))) (filter fn (tail l)) ) ) ) 
 var filter = function(fn, l) { if (is_empty(l)) { return empty_list; } else if (fn(head(l))) { return prepend(head(l), filter(fn, tail(l))); } else { return filter(fn, tail(l)); } }; 


рдмреНрд░реЗрдХ рд▓реЗрдВ, рдХрд┐рд╕реА рднреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдХрд░ рд╣реА рдЖрдЧреЗ рдмрдврд╝реЗрдВред

рдФрд░, рдпрд╛, рдирд╣реАрдВ


рд╣рдо рдкрд╛рдареНрдпрдХреНрд░рдо рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ "рд╕рд╣рд╛рдпрдХ" рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рд╕реВрдЪрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 (define (not x) (if x #f #t ) ) (define (and ab) (if a (if b #t #f ) #f ) ) (define (or ab) (if a #t (if b #t #f ) ) ) 
 var not = function(x) { if (x) { return false; } else { return true; } }; var and = function(a, b) { if (a) { if (b) { return true; } else { return false; } } else { return false; } }; var or = function(a, b) { if (a) { return true; } else { if (b) { return true; } else { return false; } } }; 


рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рд╕рдм рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рддрдиреА рджреВрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ if ?

рдереЛрдбрд╝рд╛ рдзреНрдпрд╛рди рджреЗрдВ: рдпреЗ рд╕рд┐рд░реНрдл рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛ рдХреЗ рдХрд╛рд░реНрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП (and ab) рд╢реЙрд░реНрдЯ-рдЗрди рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдмрд┐рд▓реНрдЯ-рдЗрди рдореИрдХреНрд░реЛред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред

1.4 рд▓рдВрдмреЛрджрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА


рдЕрдм, рдереЛрдбрд╝рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдкрд░ рдлрд┐рд░ рд╕реЗ рд▓реМрдЯреЗрдВрдЧреЗ:

 (define empty_list '()) (define (prepend el lst) (lambda (command) (if (equal? command "head") el (if (equal? command "tail") lst ) ) ) ) (define (head lst) (lst "head") ) (define (tail lst) (lst "tail") ) (define (is_empty lst) (equal? lst empty_list) ) 
 var empty_list = null; var prepend = function(el, list) { return function(command) { if (command === "head") { return el; } else if (command === "tail") { return list; } } }; var head = function(list) { return list("head"); }; var tail = function(list) { return list("tail"); }; var is_empty = function(list) { return list === null; }; 


рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдореБрдЭреЗ рдХреБрдЫ рдмрд╛рддреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рд╣реИред рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдпрдерд╛рд╕рдВрднрд╡ рдХрдо рд╕реЗ рдХрдо рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдпреЛрдЧ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ! рдореИрдВ рдХрдо рд╕реЗ рдХрдо рдкрд╛рдБрдЪ рдЧрд┐рди рд╕рдХрддрд╛ рд╣реВрдБ:

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдо рд▓рдЧрднрдЧ рд╕рднреА рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкрдардиреАрдпрддрд╛ (рдФрд░ рдорд╛рдирд╕рд┐рдХ рддрдирд╛рд╡) рдХреА рдХреАрдордд рдкрд░ред

рдЪрд▓реЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕, рд╕рдорд╛рдирддрд╛ рдЬрд╛рдВрдЪ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ, рдФрд░ рднрд▓реЗ if рдкрд╣рд▓реЗ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ:

 (define (prepend el lst) (lambda (selector) (selector el lst) ) ) (define (head lst) (lst (lambda (ht) h)) ) (define (tail lst) (lst (lambda (ht) t)) ) 
 var prepend = function(el, list) { return function(selector) { return selector(el, list); }; }; var head = function(list) { return list(function(h, t) { return h; }); }; var tail = function(list) { return list(function(h, t) { return t; }); }; 


рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рдПрдХ рдХрд╛рдЯрдиреЗ рдЪрд╛рд╣рд┐рдП! рдХреЛрдИ рд░реЗрдЦрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрд╛рдВрдЪ рдирд╣реАрдВ if , if рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╕реВрдЪреА рд╣реИ!

prepend рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ "рд╕реВрдЪреА" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдерд╛ рдЬреЛ рдЕрдиреБрд░реЛрдз рдкрд░ рдЕрдкрдиреЗ рд╕рд┐рд░ рдФрд░ рдкреВрдВрдЫ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЬрд╛рдирддрд╛ рдерд╛ред

рдЗрд╕ рдмрд╛рд░, рд╣рдордиреЗ "рдЕрдиреБрд░реЛрдз" рдХреЛ рдЕрдВрджрд░ рдмрд╛рд╣рд░ рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, "рд╕реВрдЪреА" рдПрдХ "рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╕рд┐рд░ рдФрд░ рдЕрдиреБрд░реЛрдз рдкрд░ рдПрдХ рдкреВрдВрдЫ рджреЛрдиреЛрдВ рджреЗрдЧрд╛"ред рдЕрдм рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рджреЛрдиреЛрдВ рднрд╛рдЧреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред

рдЪрд▓реЛ head рд╕рдорд╛рд░реЛрд╣ рдХреЛ рджреЗрдЦреЛ:

tail рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдХреЗрд╡рд▓ рдЙрд╕рдХрд╛ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рджреВрд╕рд░рд╛ рддрд░реНрдХ (рдкреВрдВрдЫ) рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓рд╛ рдирд╣реАрдВред

рд╡рд╣ рд╕рдм рд╣реИ! рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ if рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХрд╣рд╛рдВ рдЧрдП рдереЗ? рдЕрдм рдЙрдирдХреЗ рдмрджрд▓реЗ рдХреНрдпрд╛?

рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣ рдЕрднреА рднреА '() рдФрд░ рд╕рдорд╛рдирддрд╛ рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдХрдореЛрдмреЗрд╢ рд╕рдорд╛рди рдмрдирд╛рддреЗ рд╣реИрдВред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕ рдмрд┐рдВрджреБ рддрдХ рд╕рдм рдХреБрдЫ рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

 (define (empty_list selector) (selector '() '() #t) ) (define (prepend el lst) (lambda (selector) (selector el lst #f) ) ) (define (head lst) (lst (lambda (hte) h)) ) (define (tail lst) (lst (lambda (hte) t)) ) (define (is_empty lst) (lst (lambda (hte) e)) ) 
 var empty_list = function(selector) { return selector(undefined, undefined, true); }; var prepend = function(el, list) { return function(selector) { return selector(el, list, false); }; }; var head = function(list) { return list(function(h, t, e) { return h; }); }; var tail = function(list) { return list(function(h, t, e) { return t; }); }; var is_empty = function(list) { return list(function(h, t, e) { return e; }); }; 


рд╣рдордиреЗ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рдмрдирд╛рдпрд╛ред рд╕рд┐рд░ рдФрд░ рдкреВрдВрдЫ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдЕрдм рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдЦрд╛рд▓реА рд╣реИрдВред рд╣рдордиреЗ рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЛ head рдФрд░ tail рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ (рдФрд░ рдЕрдирджреЗрдЦрд╛) рдХрд┐рдпрд╛, рдФрд░ рд╣рдордиреЗ is_empty рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднреА рд╢реЗрд╖ рдХреЗ рд╕рдорд╛рди рдмрдирд╛рдпрд╛ред

рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЬрд╛рджреБрдИ рдЕрд░реНрде рдХреЗ рдмрдЬрд╛рдп рд╕рднреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рднрд╛рд╡рдирд╛ рдореЗрдВ empty_list рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ред рдЦрд╛рд▓реА рд╕реВрдЪреА рдЕрдм рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдПрдХ рд╣реА рд╣реИ - рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рджреВрд╕рд░реЗ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╣рддрд╛ рд╣реИ: "рдореЗрд░рд╛ рд╕рд┐рд░ рдФрд░ рдкреВрдВрдЫ '() рдФрд░ рдореИрдВ рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рд╣реВрдВред"

рдореИрдВрдиреЗ '() рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╕реНрдХреАрдо рдореЗрдВ рдХреБрдЫ рднреА рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд▓рдЧрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдБрдХрд┐ рд╣рдо рдЦрд╛рд▓реА рд╕реВрдЪреА рд╕реЗ head рдпрд╛ tail рдирд╣реАрдВ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВрдЧреЗ, рдпреЗ рдореВрд▓реНрдп рд╡реИрд╕реЗ рднреА рдХрднреА рднреА рдкреЙрдк рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

рдЕрдВрдд рдореЗрдВ, рд╣рдордиреЗ рдХреЗрд╡рд▓ рджреЛ рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдореВрд▓ рддрддреНрд╡реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛:

рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЖрдк рджреВрд╕рд░реЗ рд╕реЗ рдХреИрд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреНрдпрд╛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд░рд╣реЗ рд╣реИрдВ, рдпрд╛ рдХреНрдпрд╛ рдЖрдк рдХреЗрд╡рд▓ рдХреБрдЫ рдпреЛрдЬрдирд╛ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?)ред

2 рдирдВрдмрд░



prepend , head рдФрд░ tail рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рдмрд╣реБрдд рдорд╕реНрддрд┐рд╖реНрдХ-рднрдпрд╛рд╡рд╣ рджрд┐рдЦрддреА рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, map рдФрд░ filter рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕реАрдзреА рд╣реИрдВред

рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЙрди рдкрд╣рд▓реЗ рдЪрд╛рд░ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЛ рдЫрд┐рдкрд╛ рджрд┐рдпрд╛ рдерд╛ред рд╣рдордиреЗ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реЗ рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреЗ рд╕рднреА рдЧрдВрджреЗ рдХрд╛рдо рдХрд┐рдП, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг prepend , head рдФрд░ tail рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рджрд┐рдпрд╛ред

рд╕рд░рд▓ рдШрдЯрдХреЛрдВ рд╕реЗ рдХреБрдЫ рдЪреАрдЬреЗрдВ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ "рдмреНрд▓реИрдХ рдмреЙрдХреНрд╕" рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдереЛрдбрд╝рд╛ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

2.1 рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреНрдпрд╛ рд╣реИ?


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдЧреИрд░-рдЛрдгрд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЖрдк рд╕реНрд╡рдпрдВ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо рдХрд┐рд╕реА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдареАрдХ рд╣реИ, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЖрдк рд╕реНрдХреАрдо рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬрд┐рд╕рдХреА рд▓рдВрдмрд╛рдИ рдЙрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ (1 1 1) рдЕрд░реНрде рд╣реИ "рддреАрди", ("cats" #f) рдЕрд░реНрде рд╣реИ "рджреЛ", рдФрд░ '() рдЕрд░реНрде рд╣реИ "рд╢реВрдиреНрдп"ред

рдЗрд╕ рд╕реВрдЪреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдЦреБрдж рд╕реЗ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдХреБрдЫ рдРрд╕рд╛ рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ: рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА! рдЗрд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ:

 (define zero empty_list) ; '() (define one (prepend empty_list empty_list)) ; ( '() ) (define two (prepend empty_list (prepend empty_list empty_list))) ; ( '() '() ) 
 var zero = empty_list; // [] var one = prepend(empty_list, empty_list); // [ [] ] var two = prepend(empty_list, prepend(empty_list, empty_list)); // [ [], [] ] 



2.2 inc, dec



рд╣рдо рдЕрдкрдиреЗ рдирдВрдмрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реА рдореБрдЦреНрдп рдирд┐рд░реНрдорд╛рдг рд╕рд╛рдордЧреНрд░реА inc рдФрд░ dec (рд╡реЗрддрди рд╡реГрджреНрдзрд┐) рд╣реИред

 (define (inc n) (prepend empty_list n) ) (define (dec n) (tail n) ) 
 var inc = function(n) { return prepend(empty_list, n); }; var dec = function(n) { return tail(n); }; 


рдПрдХ рдирдВрдмрд░ рдореЗрдВ рдПрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдФрд░ рддрддреНрд╡ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рддреЛ, (inc (inc zero)) рдЕрд░реНрде рд╣реИ рджреЛред

рдПрдХ рдХреЛ рдШрдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ: (dec two) рдЕрд░реНрде рд╣реИ "рдПрдХ" (рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╣рдо рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ)ред

реи.рей is_zero рд╣реИ



рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдо рдЕрдХреНрд╕рд░ is_empty рдЙрдкрдпреЛрдЧ is_empty , рдЗрд╕рд▓рд┐рдП is_zero рдлрд╝рдВрдХреНрд╢рди рднреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 (define (is_zero n) (is_empty n) ) 
 var is_zero = function(n) { return is_empty(n); }; 


рд╢реВрдиреНрдп рд╕рд┐рд░реНрдл рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рд╣реИ!

2.4 рдЬреЛрдбрд╝реЗрдВ


рдПрдХ рдЗрдХрд╛рдИ рдЬреЛрдбрд╝рдирд╛ рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЕрдм, inc рдФрд░ dec , рдРрд╕рд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:

 (define (add ab) (if (is_zero b) a (add (inc a) (dec b)) ) ) 
 var add = function(a, b) { if (is_zero(b)) { return a; } else { return add(inc(a), dec(b)); } }; 


рдпрд╣ рдПрдХ рдФрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИред рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рджреЛ рд╕рдВрднрд╛рд╡рдирд╛рдПрдБ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ:

рдЕрдВрдд рдореЗрдВ, b "рдПрдВрдб" рд╣реЛрдЧрд╛ рдФрд░ рдЙрддреНрддрд░ a рд╣реЛрдЧрд╛ (рдЬреЛ рдХрд┐ b рд░реВрдк рдореЗрдВ рдмрдврд╝рд╛ рд╣реИ)ред

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╢рдмреНрдж рдирд╣реАрдВ рд╣реИ! "рдирдВрдмрд░ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ" рдХреА рдЬрд╛рдирдХрд╛рд░реА is_zero , inc рдФрд░ dec рдкреАрдЫреЗ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИ, рддрд╛рдХрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд╕рдХреЗрдВ рдФрд░ "рд╕рдВрдЦреНрдпрд╛" рдХреЗ рдЕрдореВрд░реНрдд рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХреЗрдВред

2.5 рдЙрдк


рдШрдЯрд╛рд╡ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА b рдШрдЯрддрд╛ рд╣реИ, рд╣рдо рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдХрдо рдХрд░ рджреЗрдВрдЧреЗ:

 (define (sub ab) (if (is_zero b) a (sub (dec a) (dec b)) ) ) 
 var sub = function(a, b) { if (is_zero(b)) { return a; } else { return sub(dec(a), dec(b)); } }; 


рдЕрдм рд╣рдо рдХреБрдЫ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (add two (sub three two)) рдЬреИрд╕реЗ (add two (sub three two)) рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╣рдорд╛рд░реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ "рддреАрди" рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛ (рдЬреЛ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рддреАрди рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ)ред

рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рд░реБрдХреЗрдВ рдФрд░ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрдВрджрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реВрдЪрд┐рдпрд╛рдВ рд╣реИрдВ, рдФрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИредрд╣рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝ рдФрд░ рдШрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╕рдм рдХреЗ рдЕрдВрджрд░, рдмрд╕ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдШреВрдорддреЗ рд╣реБрдП рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬреИрд╕реЗ рд╣реА рдЖрдк рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рд╕рд┐рдХреБрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛ рдпрд╣ wriggling рдЧреБрдЪреНрдЫрд╛ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ 1+1=2ред рдХреВрд▓!

2.6 mul, pow


рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЧреБрдгрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

 (define (mul ab) (if (is_zero b) zero (add a (mul a (dec b))) ) ) 
 var mul = function(a, b) { if (is_zero(b)) { return zero; } else { return add(a, mul(a, dec(b))); } }; 


рдЙрдкрд▓рдмреНрдзрддрд╛ addрдХрд╛рд░реНрдп рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдмрдирд╛рддреА рд╣реИред 3 * 4 3 + 3 + 3 + 3 + 0 рдХреЗ рд╕рдорд╛рди рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрд╛рдЧрдЬ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рдЯреНрд░реИрдХ рдХрд░реЗрдВ рдпрджрд┐ рдЬреЛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХрд╛ рдЕрд░реНрде рдЖрдкрд╕реЗ рджреВрд░ рдЬрд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рддреИрдпрд╛рд░ рд╣реИрдВ рддреЛ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВред

pow(рдШрд╛рддрд╛рдВрдХ) рд╕рдорд╛рди рд╣реИ mul, рд▓реЗрдХрд┐рди рд╕рдВрдЦреНрдпрд╛ рдХреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЧреБрдгрд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ "рдЖрдзрд╛рд░" рдПрдХ рд╣реЛрдЧрд╛, рд╢реВрдиреНрдп рдирд╣реАрдВред

 (define (pow ab) (if (is_zero b) one (mul a (pow a (dec b))) ) ) 
 var pow = function(a, b) { if (is_zero(b)) { return one; } else { return mul(a, pow(a, dec(b))); } }; 



2.7 is_equal рд╣реИ


рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдПрдХ рд╕рдорд╛рдирддрд╛ рдкрд░реАрдХреНрд╖рдг рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 (define (is_equal nm) (if (and (is_zero n) (is_zero m)) #t (if (or (is_zero n) (is zero m)) #f (is_equal (dec n) (dec m)) ) ) ) 
 var is_equal = function(n, m) { if (and(is_zero(n), is_zero(m))) { return true; } else if (or(is_zero(n), is_zero(m))) { return false; } else { return is_equal(dec(n), dec(m)); } }; 


рддреАрди рдорд╛рдорд▓реЗ рд╣реИрдВ:

рдЬрдм рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЛ рдЧреИрд░-рд╢реВрдиреНрдп рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреЛрдиреЛрдВ рддрдм рддрдХ рдХрдо рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ "рдкрд╣рд▓реЗ" рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╛ рд╡реЗ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ "рдЕрдВрдд" рдХрд░рддреЗ рд╣реИрдВред

2.8 рдХрдо_рдерд╛рдирд╛, рдмрдбрд╝рд╛_рдерд╛рди


рдЗрд╕реА рддрд░рд╣, рдЖрдк рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ less_than:

 (define (less_than ab) (if (and (is_zero a) (is_zero b)) #f (if (is_zero a) #t (if (is_zero b) #f (less_than (dec a) (dec b)) ) ) ) ) 
 var less_than = function(a, b) { if (and(is_zero(a), is_zero(b))) { return false; } else if (is_zero(a)) { return true; } else if (is_zero(b)) { return false; } else { return less_than(dec(a), dec(b)); } }; 


рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд is_equal, рдЪрд╛рд░ рдорд╛рдорд▓реЗ рд╣реИрдВ:

рдФрд░ рдлрд┐рд░ рд╕реЗ, рджреЛрдиреЛрдВ рд╕рдВрдЦреНрдпрд╛рдПрдВ рдХрдо рд╕реЗ рдХрдо рддрдм рддрдХ рдШрдЯрддреА рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо "рд╕рдорд╛рдкреНрдд" рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рддреБрд▓рдирд╛ рдХрд╛ рдирддреАрдЬрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреМрди рдкрд╣рд▓реЗ "рд╕рдорд╛рдкреНрдд" рд╣реБрдЖред

рдПрдХ рд╣реА рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реИ greater_than, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИ:

 (define (greater_than ab) (less_than ba) ) 
 var greater_than = function(a, b) { return less_than(b, a); }; 



2.9 рдбрд┐рд╡, рдореЙрдб


рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ less_than, рд╣рдо рд╡рд┐рднрд╛рдЬрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╢реЗрд╖:

 (define (div ab) (if (less_than ab) zero (inc (div (sub ab) b)) ) ) (define (rem ab) (if (less_than ab) a (rem (sub ab) b) ) ) 
 var div = function(a, b) { if (less_than(a, b)) { return zero; } else { return inc(div(sub(a, b), b)); } }; var rem = function(a, b) { if (less_than(a, b)) { return a; } else { return rem(sub(a, b), b); } }; 


рдпреЗ рджреЛрдиреЛрдВ рдкрд╣рд▓реЗ рддреАрди рдмреБрдирд┐рдпрд╛рджреА рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

3 рд╕рд░реНрдХрд▓ рдХреЛ рдмрдВрдж рдХрд░рдирд╛



рдЖрдЬ рддрдХ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ (рдмрд╣реБрдд рдмреБрдирд┐рдпрд╛рджреА) рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рд╣реИ, рдЬреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рдирд┐рд░реНрдорд┐рдд рд╣реИред рдЖрдЗрдП рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╕реВрдЪреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

3.1 nth


nрд╕реВрдЪреА рдХреЗ ith рддрддреНрд╡ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдЙрд╕рдореЗрдВ рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓ рджреЗрдВрдЧреЗ рдФрд░ nрд╢реВрдиреНрдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рддрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░ рджреЗрдВрдЧреЗ :

 (define (nth ln) (if (is_zero n) (head l) (nth (tail l) (dec n)) ) ) 
 var nth = function(l, n) { if (is_zero(n)) { return head(l); } else { return nth(tail(l), dec(n)); } }; 


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╕реВрдЪрд┐рдпрд╛рдВ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╣рдо рдЬрд┐рд╕ рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рд╣рдо рдЙрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ nрдпрд╣ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕реВрдЪреА рд╣реИ, рдФрд░ decрдЗрд╕рдореЗрдВ рд╕реЗ рдПрдХ рддрддреНрд╡ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЕрдореВрд░реНрдд рд╣реЛрдиреЗ рдкрд░ рдкрдврд╝рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдирд╣реАрдВ рд╣реИ?

рей.реи рдмреВрдВрдж, рд▓реЗрдирд╛


рдЖрдЗрдП рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдп рдХрд░реЗрдВ - dropрдФрд░ takeред

(drop l three)рдкрд╣рд▓реЗ рддреАрди рддрддреНрд╡реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕реВрдЪреА рд▓реМрдЯрд╛рдПрдЧрд╛ред

(take l three)рд╕реВрдЪреА рдХреЗ рдкрд╣рд▓реЗ рддреАрди рддрддреНрд╡реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ред

 (define (drop ln) (if (is_zero n) l (drop (tail l) (dec n)) ) ) (define (take ln) (if (is_zero n) empty_list (prepend (head l) (take (tail l) (dec n))) ) ) 
 var drop = function(l, n) { if (is_zero(n)) { return l; } else { return drop(tail(l), dec(n)); } }; var take = function(l, n) { if (is_zero(n)) { return empty_list; } else { return prepend(head(l), take(tail(l), dec(n))); } }; 



3.3 рдЯреБрдХрдбрд╝рд╛


рд╕реВрдЪреА "рд╕реНрд▓рд╛рдЗрд╕" рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реА рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХрд╛рд░реНрдп рдмрди рдЬрд╛рддрд╛ рд╣реИ drop, takeрдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдШрдЯрд╛рд╡:

 (define (slice l start end) (take (drop l start) (sub end start)) ) 
 var slice = function(l, start, end) { return take(drop(l, start), sub(end, start)); }; 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкрд╣рд▓реЗ рд╕рдм рдХреБрдЫ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ start, рдФрд░ рдлрд┐рд░ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрдЦреНрдпрд╛ рддрддреНрд╡реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред

рей.рек рд▓рдВрдмрд╛рдИ


рд╣рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ length- рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ - рдкреБрдирд░рд╛рд╡рд░реНрддреА, рд╕рдм рдХреБрдЫ рдХреА рддрд░рд╣:

 (define (length l) (if (is_empty l) zero (inc (length (tail l))) ) ) 
 var length = function(l) { if (is_empty(l)) { return zero; } else { return inc(length(tail(l))); } }; 


рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ 0 рд╣реИ, рдФрд░ рдЧреИрд░-рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рдЗрд╕рдХреА рдкреВрдВрдЫ рдХреА рд▓рдВрдмрд╛рдИ рд╕реЗ рдПрдХ рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдЕрднреА рддрдХ рдПрдХ рдордЬрдмреВрдд рдЧрд╛рдБрда рдореЗрдВ рдирд╣реАрдВ рдЙрд▓рдЭ рдЧрдП рд╣реИрдВ, рддреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ:

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЪрдХреНрдХрд░ рдЖ рд░рд╣рд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕реЗ рджреЗрдЦреЗрдВ:

 (define mylist (prepend empty_list (prepend empty_list empty_list ) ) ) (define mylistlength (length mylist)) 
 var mylist = prepend(empty_list, prepend(empty_list, empty_list)); var mylistlength = length(mylist); 



mylistрдпрд╣ рджреЛ рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреА рд╕реВрдЪреА рд╣реИред

mylistlengthрдпрд╣ рд▓рдВрдмрд╛рдИ рд╣реИ mylist...

рдХрд┐ "рджреЛ" рд╣реИрдВ ...

рдЬрд┐рдиреНрд╣реЗрдВ рджреЛ рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреА рд╕реВрдЪреА рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ ...

рдФрд░ рдпрд╣ рд╣реИ mylist!

4 рдирд┐рд╖реНрдХрд░реНрд╖




рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рдЫреЛрдЯреА рд╕реА рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд╣рд╛рдиреА рдкрд╕рдВрдж рдЖрдИ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдж рд▓рд┐рдЯрд┐рд▓ рд╕реНрдХреАрдорд░ рдкрдврд╝рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ ред рдпрд╣ рдкрд╣рд▓реА рдХрд┐рддрд╛рдмреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдореЗрд░реА рд╕рдордЭ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред рдбрд░реЛ рдордд рдХрд┐ рд╡рд╣рд╛рдБ рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рднрд╛рд╖рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреА рд╣реИред

рдореИрдВрдиреЗ рд▓реЗрдЦ рд╕реЗ рд╕рднреА рдХреЛрдб рдХреЗ рд╕рд╛рде рдЬреАрдЖрдИрдПрд╕рдЯреА (рдореВрд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рднреА рдмрдирд╛рдпрд╛ рд╣реИ )ред рдмреЗрдЭрд┐рдЭрдХ рдЗрд╕реЗ рдХрд╛рдВрдЯреЗ рдФрд░ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


рдпрд╛, рдпрджрд┐ рдЖрдк рдХреБрдЫ рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдбрд╝реА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:


рдпрд╛рдж рд░рдЦреЗрдВ, рдмрд┐рдВрджреБ рдХреБрдЫ рдРрд╕рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рд╣реА рд╡реЛрд▓реНрдЯреЗрдЬ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрдЬрд┐рд╕реНрдЯрд░ рдФрд░ рд╕рд░реНрдХрд┐рдЯ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрдпреЛрдЬрди рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╕реБрдВрджрд░, рдкрд░рд┐рдкреВрд░реНрдг, рд╕рд╛рд░ рдЕрд░реНрде рдореЗрдВ "рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВред

Source: https://habr.com/ru/post/In176233/


All Articles