翻蚳è
泚ïŒãªãªãžãã«ã¯ãã¡ã ã ãªãªãžãã«ã®äŸã¯ãã¹ãŠJavaScriptã§èšè¿°ãããŠããŸãããSchemeã«ç¿»èš³ããããšã«ããŸããã ããã»ã©æ確ã«ãªããªãã£ããšæããŸããããã®èšèªã®çŸããã¯ãã¹ãŠèŠããŠããŸãã
UPDïŒå³åŽã®ãã¹ãŠã®äŸã«JavaScriptã®å
ã®äŸãè¿œå ããŸããã
ã³ã³ãã¥ãŒã¿ãŒã®å®çšçãªåŽé¢ïŒãµã€ãºãééãäŸ¡æ Œãç±ãªã©ïŒã«ç®ãåãããšãããã°ã©ãã³ã°èšèªã¯å®éã«äœãã§ããã¯ãã§ããïŒ ãã®è³ªåã調ã¹ãŠã¿ãŸãããã
ãã®èšäºã®äŸãç解ããã«ã¯ãLISPïŒSchemeïŒã®é¢æ°ã«é¢ããåºæ¬çãªæŠå¿µãå¿
èŠã§ãã ãã®ã³ãŒããäœãå°å·ããããç解ããŠããå Žåãããã«èªãããšãã§ããŸãïŒ
(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);
|
ãã®èšäºã¯è³ã®ããã®åãªããã¬ãŒãã³ã°ã§ãããå®éã®ã³ãŒãã§äœ¿çšã§ãããã®ã§ã¯ãããŸããã ããããã®ã¿ãªã¹ããå®éã®æã§æ±ºããŠäœ¿çšããªãã¹ã±ãŒã«ãæŒå¥ããã®ãšåãããã«ãããã°ã©ããŒã¯æã
è³ã䌞ã°ãå¿
èŠããããŸãã
ãã¢ã«ã¯Schemeã䜿çšããŸãããæ©èœãäžæµã®é¢æ°ããã³åå¥ã¹ã³ãŒãïŒäž»ã«ã¯ããŒãžã£ãŒïŒãšããŠãµããŒãããä»ã®èšèªã¯ãã¹ãŠè¡ããŸãã
ãã§ã«ãã®ãããªãã®ãèŠãããšãããã°ïŒãããã
SICPã
The Little Schemer㧠ïŒãããªãèªèº«ã®ããã«äœãæ°ãããã®ãæ¢ããŠã³ãŒãã
調ã¹ãŠã¿ãã¹ãã§ãã
ãã®ãããªãã®ãèŠãããšããªããã°ããããããã®ããããŸãã åããŠããã¹ãŠãéåžžã«å¥åŠã«èŠããŸãã ãã£ããåãããŠãã ããã åã®ããŒããç解ããŠãã次ã®ããŒãã«é²ãã§ãã ããã ããã§èª¬æããæŠå¿µã¯çŽæçã§ã¯ãªããããããŸããããéåžžã«åçŽãªéšåããæ§ç¯ãããŠããŸãã
ãããŠæåŸã«ïŒããããªããã©ããã§ç«ã¡åŸçããŠãããªãã絶æããªãã§ãã ããã é¢æ°ã®ããã©ãŒãã³ã¹ãçŽã®äžã§è¿œè·¡ããããšã¯ããããã©ã®ããã«æ©èœããããç解ããããã®éåžžã«è¯ãæ¹æ³ã§ãïŒå¿«é©ãªæžã蟌ã¿ã®ããã«è¯ãããŒã¿ãã«ãã¹ã¯ã賌å
¥ããããšããå§ãããŸãïŒã ããã§è§£æ±ºããªãå Žåã¯ãèšäºãéããŠææ¥èªãã ãã«æ»ããŸãã æã
ãæ°ããæŠå¿µã圌ãã®å ŽæãèŠã€ããåã«ããªãã®é ã®äžã§å°ãããŸããå¿
èŠããããŸãã
1ãªã¹ã
ãããå§ããŸãããïŒ ããã°ã©ããŒãæãããå®è¡ããããã»ã¹ã®1ã€ã¯ãããŒã¿ã®ã°ã«ãŒãåã§ãã Schemeã«ã¯ãã®ããã®çµã¿èŸŒã¿ãªã¹ãããããŸãïŒãã以å€ã®å Žåã¯ãLISPã§ã¯ãããŸããïŒã
(define names (list "Alice" "Bob" "Candice"))
| var names = ["Alice", "Bob", "Candice"];
|
ããããSchemeã«ãªã¹ãããªãå Žåã¯ã©ãã§ããããïŒ ç§ãã¡ã¯ãããããŸãã¯ãããã«é¡äŒŒãããã®ãèªåã§äœãããšãã§ããŸããïŒ
ãã®è³ªåã«çããããã«ããªã¹ãã®ãããªãã®ãäœæããããã«å¿
èŠãªæå°éã®ããšãèããŠã¿ãŸãããã ãããè¡ãã«ã¯å€ãã®æ¹æ³ããããŸããããã®ãã¡ã®1ã€ã ããæ€èšããŸãã
ãªã¹ããæäœããã«ã¯ã4ã€ã®ãã®ãå¿
èŠã§ãã
- ã空ã®ãªã¹ããã®æŠå¿µ
- ãªã¹ãã®äžçªäžã«ã¢ã€ãã ãè¿œå ããæ¹æ³
- ãªã¹ãã®æåã®ã¢ã€ãã ãååŸããæ¹æ³
- ãªã¹ãã®æåã®èŠçŽ ãé€ããã¹ãŠãååŸããæ¹æ³
ããã4ã€ã®ãã®ãããå Žåããããã«åºã¥ããŠãç§ãã¡ãæããã¹ãŠãæ§ç¯ã§ããŸãã ããšãã°ãåäžã®ã¢ã€ãã ãããªã¹ããäœæããã«ã¯ã空ã®ãªã¹ãã®äžçªäžã«ãã®ã¢ã€ãã ãè¿œå ã§ããŸãã
ãããã®4ã€ã®éšåãå®è£
ããã«ã¯å€ãã®æ¹æ³ããããŸã-é¢æ°ã䜿çšããŸãã 圌ãã®ã¹ã±ããã¯æ¬¡ã®ãšããã§ãã
(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) { |
ãããã®åå®çŸ©ã®èª¬æã¯æ¬¡ã®ãšããã§ãã
empty_list
ã¯ããŒãèŠçŽ ã®ãªã¹ããè¡šãç¹å¥ãªå€ã§ãã äœã§ãæ§ããŸããã®ã§ãSchemeã®æšæºã®
'()
ã䜿çšããŸãã ããã«ã€ããŠã¯åŸã§èª¬æããŸãã
(prepend 1 some_list)
ã¯ãå
é ã«
1
æ¿å
¥ãããå€ããªã¹ãã®ããã«èŠããæ°ãããªã¹ããè¿ããŸãã ãããã£ãŠãçªå·
1
ãš
2
ãªã¹ããäœæããå Žåã
(prepend 1 (prepend 2 empty_list))
è¿œå
(prepend 1 (prepend 2 empty_list))
è¿œå
(prepend 1 (prepend 2 empty_list))
ãŸãã¯ã空ã®ãªã¹ãã«
1
ãè¿œå ããçµæã«
2
ãè¿œå ããšæžãããšãã§ããŸã
(head some_list)
ã¯ããªã¹ãã®æåã®ã¢ã€ãã ãè¿ããŸãã 空ã®ãªã¹ãããã®çµæã¯å®çŸ©ãããŠããªãããã泚æããŠãã ããã
(tail some_list)
ã¯ãæåã®èŠçŽ ããªãå€ããªã¹ãã®ããã«èŠããæ°ãããªã¹ããè¿ããŸãã ç¹°ãè¿ã
tail
ãã空ã®ãªã¹ããã
tail
ãåŒã³åºããšããã¹ãŠãå°ç¡ãã«ãªããŸãã
(is_empty some_list)
ã¯ããã®ãªã¹ãã空ã®å Žåã¯
#t
ãè¿ããããã§ãªãå Žåã¯
#f
ãè¿ããŸãã
ãããã®4ã€ã®é¢æ°ïŒããã³ç©ºã®ãªã¹ãã«å¯Ÿããç¹å¥ãªæå³ïŒãã§ãããããããã«åºã¥ããŠç©äºã®æ§ç¯ãéå§ã§ããã®ã§ãããããå®è£
ããæ¹æ³ãèŠã€ããŸãããïŒ
1.1 If
ãªã¹ã
cons
ã
cdr
ã
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; }; |
ããããæ°ã«å
¥ãã®Schemeã€ã³ã¿ãŒããªã¿ãŒã«è²Œãä»ããŠéãã§ãã ããïŒ
(define e empty_list) (display (is_empty e)) | var e = empty_list; console.log(is_empty(e)); |
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
ïŒ
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
ãé¢æ°ãè¿ãããšãç解ã§ããŸãã ãããã£ãŠãç§ãã¡ã®ã¡ãã£ãšããå®éšã§ã¯ããªã¹ãã¯åãªãïŒã©ã ãïŒSchemeé¢æ°ã§ãïŒ
ããã§ããªã¹ãã§äœãããå¿
èŠããããŸããïŒãã§ã«ã«ããŒããŠãããã€ãããã§ãã¯ãã以å€ïŒïŒ ããŠãé ãšå°»å°ŸãååŸããå¿
èŠããããŸãã
(prepend ht)
ãåŒã³åºããšããåŒæ°ãšããŠheadãštailãæž¡ãã ãã§ãïŒ ãã®ããã
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ãã®åºç€ã®äžã«æ§ç¯
ãªã¹ããã§ããã®ã§ããããã«åºã¥ããŠããã€ãã®äžè¬çãªããšãç·Žç¿ããŠå®è£
ããŸãããã
å°å³
ãªã¹ãã®äžè¬çãªã¿ã¹ã¯ã®1ã€ã¯ãå€ããã®ãã«ãŒãããŠåèŠçŽ ã«äœããã®æ©èœãé©çšããããšã«ãããæ°ãããã®ãäœæããããšã§ãã ããã¯
map
ãšåŒã°ã
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)) | var square = function(x) { return x * x; } var numbers = prepend(1, prepend(2, prepend(3, empty_list))); var squared_numbers = map(square, numbers);
|
Schemeã¹ã¿ã€ã«ã®ãªã¹ãïŒ
(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) | var numbers = prepend(1, prepend(2, prepend(3, empty_list))); var is_odd = function(x) { return x % 2 === 1; } filter(is_odd, numbers);
|
ããã§
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; } } };
|
åœç¶ãSchemeã«ã¯ãã§ã«ããããã¹ãŠããããŸããããããã䜿çšããã«ã§ããéããããããçš®é¡ã®èšèªæ©èœã䜿çšããªãããã«ããŠããŸãã é¢æ°ãš
if
ãã©ããŸã§äœ¿çšã§ããŸããïŒ
ã¡ãã£ãšãã泚æïŒãããã¯ãã ã®Schemeé¢æ°ãªã®ã§ã
(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; };
|
ãã®å®è£
ã§ã¯ãããã€ãã®ããšãéèŠã§ãã ç§ãã¡ã®ç®æšã¯ãã§ããã ãå°ãªãèšèªæ©èœã䜿çšããããšã§ããããã§ã«ååã«äœ¿çšããŠããŸãïŒ å°ãªããšã5ã€ã«ãŠã³ãã§ããŸãã
- æ©èœ
if
æ¡ä»¶
- è¡
- ããŒã«å€ïŒ
#f
ããã³#t
ãçµæis_empty
ïŒ
- ç䟡ãã¹ãïŒ
equal?
ïŒ
ãã®ã»ãšãã©ãã¹ãŠãåãé€ãããšãã§ããŸãããèªã¿ãããïŒããã³ç²Ÿç¥çè² æ
ïŒãç ç²ã«ããã ãã§ãã
æååãç䟡æ§ãã§ãã¯ããããŠæåã«æ§ç¯ç©ããã£ããšããŠãåé€ããŸãããïŒ
(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
é¢æ°ãèŠãŠã¿ãŸãããïŒ
head
ã¯ãªã¹ããåãå
¥ããŠ(list ...)
ãåŒã³åºã(list ...)
ããã¯ããã¡ãã£ãšããªã¹ãããã¹ãŠã®ããŒã¿ããã®å°ããªé¢æ°ã«æž¡ããŠãã ããããšããæå³ã§ãã
- ãªã¹ãã¯
(... el lst)
åŒã³åºã(... el lst)
ããã¯ããããŠãæ©èœã¯ã»ãšãã©ãããŸãããããã«ç§ã®é ãšå°»å°ŸããããŸãããšããæå³ã§ãã
- è£å©é¢æ°ã¯å®éã«ã¯
(lambda (ht) h)
ã§ããããã¯ãåŒæ°ãšããŠheadãštailãæå®ããŠåŒã³åºããããšãã«ãheadãè¿ãããšãæå³ããŸãã
head
ã¯çµæãååŸããåŒã³åºãå
ã®é¢æ°ã«çŽæ¥æž¡ããŸãã
tail
ã¯ãŸã£ããåãããã«æ©èœãããã«ããŒé¢æ°ã®ã¿ã2çªç®ã®åŒæ°ïŒtailïŒãè¿ããæåã®åŒæ°ã¯è¿ããŸããã
以äžã§ãïŒ çãã
if
ãããã³æ¶å€±ãã
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
é¢æ°ã«3çªç®ã®åŒæ°ãèæ
®ïŒããã³ç¡èŠïŒããã
is_empty
é¢æ°ãæ®ããšåãã«ããŸããã
æåŸã«ãç¹å¥ãªéæ³ã®æå³ã§ã¯ãªãã
empty_list
ãä»ã®å
šå¡ãšåã粟ç¥ã§åå®çŸ©ã
empty_list
ãã 空ã®ãªã¹ãã¯éåžžââã®ãªã¹ããšåãã«ãªããŸãããå¥ã®ãªã¹ããååŸããŠãé ãšå°»å°Ÿã¯
'()
ã§ç©ºã®ãªã¹ãã§ãããšèšãé¢æ°ã§ãã
Schemeã§ã¯ãã以äžè¯ããã®ãèŠã€ãããªãã£ãããã
'()
ã䜿çšããŸããããä»ã®å€ãèªç±ã«äœ¿çšã§ããŸãã 空ã®ãªã¹ããã
head
ãŸãã¯
tail
ãåŒã³åºããªãããã«æ³šæããããããããã®å€ã¯è¡šç€ºãããŸããã
æåŸã«ããªã¹ãã®åºæ¬çãªèŠçŽ ãå®è£
ããŸãããã次ã®2ã€ã ãã§ãã
- æ©èœ
- 空ã®ãªã¹ãã®å Žåã¯
#t
ããã³#f
ã
å¿
èŠã«å¿ããŠã2çªç®ãåé€ããæ¹æ³ãèããŠãã ããïŒãã®å Žåã
å®éã«åé€ããã®ã§ã
ã ããããšãSchemeã®æ©èœãæé»çã«äœ¿çšããŠããã ãã§ããïŒïŒã
2ã€ã®æ°å
prepend
ã
head
tail
ã®å®çŸ©ã¯éåžžã«é ãçãããã§ãã ãã ãã
map
ãš
filter
å®çŸ©
filter
ãã§ã«ç°¡åã§ãã
ããã¯ãæåã®4ã€ã®é¢æ°ã®ãªã¹ãã®å®è£
ã®è©³çŽ°ãé ããããã§ãã ã»ãšãã©äœããªããªã¹ããäœæãããšããé¢åãªäœæ¥ããã¹ãŠè¡ããåçŽãª
prepend
ã
head
ããã³
tail
ã€ã³ã¿ãŒãã§ãŒã¹ã®åŸãã«é ããŸããã
åçŽãªã³ã³ããŒãã³ãããããã€ãã®ãã®ãäœæããããããããã©ãã¯ããã¯ã¹ãã«æœè±¡åãããšããã¢ã€ãã¢ã¯ãã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ãšããã°ã©ãã³ã°ã®æãéèŠãªã¢ã€ãã¢ã®1ã€ã§ãã
2.1æ°åãšã¯äœã§ããïŒ
ãã®èšäºã§ã¯ãéè² æ°ã®ã¿ãæ€èšããŸãã è² ã®æ°ã®ãµããŒããèªåã§è¿œå ããŠã¿ãããšãã§ããŸãã
ã©ã®ããã«æ°åãè¡šçŸã§ããŸããïŒ ãã¡ãããSchemeçªå·ã䜿çšã§ããŸããã䜿çšããèšèªæ©èœã®æ°ãæå°éã«ããããšããŠãããããããã»ã©ã¯ãŒã«ã§ã¯ãããŸããã
æ°ãè¡šã1ã€ã®æ¹æ³ã¯ãé·ãããã®æ°ã«çãããªã¹ãã䜿çšããããšã§ãã
(1 1 1)
ã¯ã3ããæå³ãã
("cats" #f)
ã¯ã2ããæå³ãã
'()
ã¯ããŒãããæå³ããŸãã
ãã®ãªã¹ãã®èŠçŽ èªäœã«ã¯æå³ããªãããããã§ã«ååšãããã®ãã€ãŸã空ã®ãªã¹ããåãäžããŸãããã æããŠïŒ
(define zero empty_list) | var zero = 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); };
|
çªå·ã«1ãè¿œå ããã«ã¯ããªã¹ãã«å¥ã®èŠçŽ ãæ¿å
¥ããã ãã§ãã ãããã£ãŠã
(inc (inc zero))
ã¯2ãæå³ããŸãã
1ãæžç®ããã«ã¯ãèŠçŽ ã®1ã€ãåã«åé€ããŸãã
(dec two)
ã¯ã1ããæå³ããŸãïŒè² ã®æ°ãç¡èŠããããšãå¿ããªãã§ãã ããïŒã
2.3 is_zero
ãªã¹ãã®æäœã®æåã«ã
is_empty
ããã䜿çšããŠã
is_empty
ããã®ããã
is_zero
é¢æ°
is_zero
䟡å€ã
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)); } };
|
ããã¯å¥ã®ååž°çãªå®çŸ©ã§ãã æ°åãè¿œå ãããšã次ã®2ã€ã®å¯èœæ§ãçããŸãã
b
ããŒãã®å Žåãçµæã¯ãã a
- ãã以å€ã®å Žåãå ç®
a
ãb
å ç®a+1
ãšåãã§ããb-1
æçµçã«ãããb
ã¯çµäºããçãã¯a
ïŒæžå°ããã«ã€ããŠå¢å ããŸãb
ïŒã«ãªããŸãããªã¹ãã«ã€ããŠã®èšèã¯ãªãããšã«æ³šæããŠãã ããïŒãæ°åã¯ãªã¹ãã§ããããšããæ
å ±ã¯èåŸis_zero
ã«é ããŠããããšãå€æããããinc
ãdec
ãããç¡èŠããŠãæ°åãã®æœè±¡åã¬ãã«ã§äœæ¥ããããšãã§ããŸãã2.5ãµã
æžç®ã¯å ç®ã«äŒŒãŠããŸãããæžå°ããã«ã€ããŠå¢å ãã 代ããã«ãäž¡æ¹ãäžç·ã«åæžããŸããa
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))
ãçµæã¯ã·ã¹ãã å
ã®æ°å€ã3ãã®è¡šçŸã«ãªããŸãïŒãã¡ãããããã¯3ã€ã®èŠçŽ ã®ãªã¹ãã§ãïŒããã°ããç«ã¡æ¢ãŸã£ãŠãæ°åã®äžã«ã¯å®éã«ãªã¹ããããããªã¹ãã®äžã«ã¯é¢æ°ä»¥å€ã¯äœããªãããšãæãåºããŠãã ãããæ°å€ãå ç®ããã³æžç®ããããšãã§ãããã®ãã¹ãŠã®äžã§ãé¢æ°ãååŸã«ç§»åããä»ã®é¢æ°ã«æ¡åŒµããåŒã³åºããšçž®å°ããŸã1+1=2
ããã£ãããïŒ
2.6 mulãããŠ
ãã¬ãŒãã³ã°ã®ããã«ãæ°å€ã®ä¹ç®ãå®è£
ããŸãã (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
ããŸãããæ°å€ã®ã³ããŒãå ç®ãã代ããã«ãããããä¹ç®ããååž°ã®ãããŒã¹ãã¯ãŒãã§ã¯ãªã1ã«ãªããŸãã (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)); } };
|
3ã€ã®ã±ãŒã¹ããããŸãã- äž¡æ¹ã®æ°å€ããŒãã®å Žåããããã¯çãã
- æ°åã®1ã€ã ãããŒãã®å Žåããããã¯çãããããŸãã
- ãã以å€ã®å Žåã¯ããããããã1ãå·®ãåŒããŠããäžåºŠããçŽããŠãã ãã
ãã®é¢æ°ã2ã€ã®éãŒãåŒæ°ã§åŒã³åºããããšãã©ã¡ããæåã«ãçµäºãããããåæã«ãçµäºããããŸã§ãäž¡æ¹ãšãæžå°ããŸãã2.8 less_thanãgreater_than
åæ§ã«ã以äžãå®è£
ã§ããŸã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
ã4ã€ã®ã±ãŒã¹ããããŸãã- äž¡æ¹ã®æ°åããŒãã§ããã®åŸããããŠããªãå Žåã¯
a
äœãæªæºb
- ãã以å€ã®å Žåã
a
ïŒããã³ã®ã¿a
ïŒããŒãã«çããå Žåãããã¯b
- ãã以å€ã®å Žåã
b
ïŒããã³ã®ã¿b
ïŒããŒãã«çããå Žåãããa
ããå°ããããããšã¯ã§ããŸããb
ïŒè² ã®æ°ã¯èæ
®ãããŸããïŒ
- ãã以å€ã®å Žåã¯ãäž¡æ¹ãæžãããŠåè©Šè¡ããŠãã ããã
ç¹°ãè¿ããŸãããäž¡æ¹ã®æ°å€ã¯å°ãªããšã1ã€ããçµäºããããŸã§æžå°ããæ¯èŒã®çµæã¯ã©ã¡ããæåã«ãçµäºããããã«ãã£ãŠæ±ºãŸããŸããã«ã€ããŠãåãããšãã§ããŸãgreater_than
ãããã£ãšç°¡åãªæ¹æ³ããããŸãã (define (greater_than ab) (less_than ba) ) | var greater_than = function(a, b) { return less_than(b, a); };
|
2.9 divãmod
ããã§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); } };
|
ããã2ã€ã¯ãè² ã®æ°ã䜿çšã§ããªããããæåã®3ã€ã®åºæ¬æäœãããå°ãè€éã§ãããããã©ã®ããã«æ©èœããããå¿
ãç解ããŠãã ããã3åãéãã
çŸåšãŸã§ã«ããªã¹ãäžã«æ§ç¯ãããïŒéåžžã«åºæ¬çãªïŒã¯ãŒãã³ã°ãã³ããŒã·ã¹ãã ãæ¢ã«ãããŸããæåã«æ»ã£ãŠãæ°åã䜿çšããå¥ã®ãªã¹ãé¢æ°ãå®è£
ããŸãããã3.1çªç®
n
ãªã¹ãã®içªç®ã®èŠçŽ ãååŸããã«ã¯ãåçŽã«ãªã¹ãããèŠçŽ ãåé€ãã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
. , , ?
3.2 drop, take
â
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 slice
«» ,
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
, .
3.4 length
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ã§ã空ã§ãªããªã¹ãã®é·ãã¯1ã«ãã®æ«å°Ÿã®é·ããå ãããã®ã§ããããªãã®èãããŸã 匷åãªçµã³ç®ã«çµ¡ãŸã£ãŠããªãå Žåãããã«ã€ããŠèããŠãã ããïŒ- æ©èœã§äœããããªã¹ã
- æ°åã¯ãé·ããæ°åãè¡šããªã¹ãããäœæãããŸã
length
ããã¯ãªã¹ããåãåãããã®é·ããæ°å€ïŒé·ãããã®æ°å€ã«çãããªã¹ãïŒãšããŠè¿ãé¢æ°ã§ã
- ãããŠä»ã ã決å®ããŸããã
length
ãããªãé·ãéïŒãªã¹ãã®é·ãã䜿ã£ãŠæ°åãè¡šçŸããïŒæ°åã䜿ã£ãŠããŸããïŒ
ããªãã¯ãã§ã«ããŸããæããŸãããïŒããã§ãªãå Žåã¯ããããèŠãŠãã ããïŒ (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
ããã¯ã2ã€ã®ç©ºã®ãªã¹ãã®ãªã¹ãã§ããmylistlength
ããã¯é·ãmylist
ã§ã...ã2ã€ãããããŸã... 2ã€ã®ç©ºã®ãªã¹ãã®ãªã¹ãã§è¡šãããŸã...ãããŠããã§ãmylist
ïŒ4çµè«
ãã®ã¡ãã£ãšããæ··ä¹±ãã話ã奜ããªããThe Little Schemerãèªãããšã匷ããå§ãããŸããããã¯ãããã°ã©ãã³ã°ã«å¯Ÿããç§ã®ç解ãå®éã«å€ããæåã®æ¬ã®1ã€ã§ããããã§Schemeã䜿çšãããŠããããšãæããªãã§ãã ãã-èšèªã¯æ¬åœã«éèŠã§ã¯ãããŸããããŸãããã®èšäºã®ãã¹ãŠã®ã³ãŒãã䜿çšããŠèŠæšïŒããã§ã¯å
ã®JavaScriptã®äŸïŒãäœæããŸãããèªç±ã«ãã©ãŒã¯ããŠãå®éšã«äœ¿çšããŠãã ããããŸããååž°é¢æ°ãç·Žç¿ããã«ã¯ã次ãå®è£
ã§ããŸããappend
-ãªã¹ãã®æåŸã«ã¢ã€ãã ãè¿œå ãã
concat
-2ã€ã®ãªã¹ããçµåãã
min
ããã³max
-2ã€ã®æ°å€ã®å°ããæ¹ïŒå€§ããæ¹ïŒãèŠã€ãã
remove
-ãšåãã§ãfilter
ãããã¹ãé¢æ°ïŒè¿°èªïŒãè¿ãèŠçŽ ã®ãªã¹ãã®ã¿ãè¿ããŸã#f
contains_number
-æ°å€ããªã¹ãã«å±ããŠãããã©ããã確èªãã
ãŸãã¯ããã£ãšæ·±å»ãªãã®ãå¿
èŠãªå Žåã¯ãäœææžã¿ã®æŠå¿µã«åºã¥ããŠå€§èŠæš¡ãªæŠå¿µãå®è£
ããŸãã- è² ã®æ°
- éè² ã®æçæ°
- è² ã®æçæ°
- é£æ³ãªã¹ã
éèŠãªã®ã¯ãå®éã®ã³ã³ãã¥ãŒã¿ãŒã§ããŸãæ©èœãããã®ãäœæããããšã§ã¯ãªããšããããšã§ããé©åãªé»å§ãåŸãããã«ãã©ã³ãžã¹ã¿ãšåè·¯ã®ç¹å®ã®çµã¿åãããååŸããæ¹æ³ãèãã代ããã«ãçŸããå®ç§ãªæœè±¡çãªæå³ã§ãã³ã³ãã¥ãŒãã£ã³ã°ããèããŠãã ããã