@kyanny's blog

My thoughts, my life. Views/opinions are my own.

最近 Gauche の勉強をしている

ゴールデンウィークくらいから、 Gauche の勉強をしています。

プログラムで作りたいものなんて、なくたっていいじゃん - 刺身☆ブーメランのはてなダイアリー で書いた例にもれずというか、やはり Gauche も何かを作りたくて勉強しているわけではなくて、もっとしょうもない動機でやり始めています。

でも、自分で手を動かしてプログラムを書いてみないとなかなか身につかない。しかし書きたいプログラムは思いつかない。そこでちょっと考えて、書きたくなくてもいいから毎日ごくごく簡単なプログラムを繰り返し書くことにしました。

例えば、引数をひとつとり、それがアトムであるかどうか(対でないかどうか)を確かめる atom? という手続きが The Little Schemer に載っていたので、それを見ずに同じように動くものを自分で書く。すでに本で読んでいるのでそんなに迷うこともなく書けます。これ一回だとフーンって感じだけど、翌日も同じものを書く。簡単にかけたら、今度は lat? を書いてみる。 lat? は、引数にリストを一つとり、リストの各要素がすべてアトムであるかどうかを確かめる手続きだそうです。先にかいた atom? が使えるので、まず atom? をかいてから lat? をかき、次に rember を・・・という風に続けます。

これを、毎日違う作業ディレクトリを作って、そこで一から始める、というのを数日続けています。こんなシェル関数を定義して、ターミナルを起動したらまず today と打つことにします。

today(){
    _WORK=$HOME/daily
    _DATE=`date +%Y-%m-%d`
    _TODAY=$_WORK/$_DATE
    mkdir -p $_TODAY
    cd $_TODAY
}

やり始める前は、不毛だなあとか、こんなことして意味あるんだろうか、とか思ったものでしたが、いざやり始めてみると、一日に数行であってもプログラムを書く理由というか、動機にはなるので、やってみて良かったと思います。スポーツでもなんでも、基礎の反復の先に応用があり、結果があるのだから、プログラムだって同じように、全然クリエイティブではない基本的なコーディング作業を繰り替えしていけばその先にもう少しマシなものを作れる道が開けてくるんじゃないかなぁと思うのです。

日付ごとに作業ディレクトリを分けると、「昨日の晩に三時間もパソコンをしていたのに、プログラムはたったこれっぽっちしか書いていない」とか、いかに自分がプログラムをかけていないかがよくわかるので、危機感を煽れます。あと、作業ディレクトリが一つだと(例えば $HOME/gauche など)昨日書いた atom.scm があるのに新しく書き始めるのがばからしくなってしまうけど、新しいディレクトリの中は空っぽなので毎日新鮮な気持ちで atom.scm を書き始められます。

この作業ディレクトリたちを、 github か何かにコミットするようにして履歴を残しつつ公開までして、ろくなプログラムをかけていない自分を晒すプレイに興じるとか、毎日書いたコードの行数をはてなグラフあたりにポストしてぜんぜんプログラムをかけていない自分を晒すプレイに興じるとか、アイデアはあるのですが、まだ実行できていません。

Gauche は何だかよく分からないことだらけですが、かえって謙虚な気持ちで学べていると思います。 Ruby を勉強しようとしたことが何度かありますが、 Perl を少し知っているだけに、 Perl でならできる○○を Ruby でどうやればいいのかわからない、とストレスを感じることが多くて、ついつい傲慢というか、不遜というか、そんな態度になってしまってうまくいきませんでした。必要に迫られてやっているわけでもないし、ゆっくりのんびり楽しいと思えるペースで学んでいきたいです。来年の今頃までに継続が理解できたら嬉しいのだけど、どうかな。

昨日はこんなのを書きました。 htpasswd コマンドみたいなことをする htpasswd.scm を、書こうと思って途中までしかできなかったもの。

;; htpasswd.scm

(use srfi-1)
(use srfi-14)
(use srfi-27)

(define salt-set
  (lambda ()
    (cons #\/
          (cons #\.
                (append (char-set->list #[a-zA-Z]) (iota 10))))))

(define seed->salt-set
  (lambda (seed)
    (

(define seed
  (lambda (int)
    (random-integer int)))

(define salt
  (lambda (seed1 seed2)


(salt)

(salt 10 12)

プログラミングGauche

プログラミングGauche

The Little Schemer (The MIT Press)

The Little Schemer (The MIT Press)