読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

Gaucheのお勉強

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)とかの意味がよく分からなかった。