Gaucheのお勉強
Schemeをそれとなくやろうと思って、SICPとかは難しいなーと思って、簡単そうなのを探したら、R5RS (Revised^5 Report on Algorithmic Language Scheme) 日本語訳がよさそうなので、見ながらちょこちょこ書いた。
再帰を使ってリストのサイズを出す。末端再帰とか、まだよく分かってない。
#!/usr/bin/env gosh (define (size lis) (if (pair? lis) (+ (size (cdr lis)) 1) 0)) (print (size '()))
リストをつくる。
#!/usr/bin/env gosh (define (list first . remain) (cons first remain)) (print (list 1 2 3 4 5))
map。
#!/usr/bin/env gosh (define (map proc lis) (if (pair? lis) (cons (proc (car lis)) (map proc (cdr lis))) '())) (print (map - '(1 2 3 4 5)))
引数の束縛。可変長引数の前に固定引数が一つは必要っぽい。
#!/usr/bin/env gosh (define bind (lambda (proc . args1) (lambda (first . args2) (apply proc (append args1 (cons first args2)))))) (print ((bind + 1) 2 3 4 5 6 7 8 9))
Rubyみたいなrange。リストを返す。
#!/usr/bin/env gosh
(define ..
(lambda (min max)
(define create
(lambda (n lis)
(if (< n min)
lis
(create (- n 1) (cons n lis)))))
(if (>= min max)
'()
(create max '()))))
(define ...
(lambda (min max)
(.. min (- max 1))))
(print (... 1 10))
(print (.. 10 1))
再帰慣れてないと難しいなあ。あと、(1 2 . 3)とかの意味がよく分からなかった。