2009-02-01から1ヶ月間の記事一覧

仕様

どこまでがSchemeの仕様で、どこからがGaucheの拡張なのかなぁ。 この本を読んでいて、よく思う。 初心者のうちはそこまで気にする必要はないのかも知れないけど。 Schemeの仕様について知りたければ、R5RS(http://www.unixuser.org/~euske/doc/r5rs-ja/)…

cond

8章4節のcondについて。 条件判断といえば、自分はif式よりもこっちばっかり使ってるな。 たぶんThe Little Schemerのせい。 condも知らないことが結構あった。 (cond (条件式1 条件式1が#f以外の値になった場合のcond式の値) (条件式2 条件式2が#f以外の値…

if

8章4節のifについて。 今まで何度か使ったけど、知らないことも多かった。 (if 条件式 条件式が#f以外の場合のif式の値 条件式が#fの場合のif式の値) だそうだ。 3つ目の引数は省略可能だということは初めて知った。 3つ目の引数が省略された場合に「条件式…

8章3節の練習問題とか

any-predとevery-predを自分で定義しなさい、ということなので、やってみた。 (define my-any-pred (lambda args (lambda (x) (cond ((null? args) #f) (((car args) x) #t) (else ((apply my-any-pred (cdr args)) x)))))) (define my-every-pred (lambda a…

もうちょっと述語

8章3節、真偽値に関する手続き。 等価述語以外の述語 前回は等価述語だったけど、等価述語以外にも述語はたくさんありますよ、と。 型を判定したり、値の性質を判定したり。 詳しくは追々出てくるっぽい。Schemeには述語を引数にとったり、述語を返したりす…

いろいろな「等しさ」

さて、8章2節。 真偽値を返す関数のことを「述語」と呼び、とくに等しいかどうかを調べる関数を「等価述語」と呼ぶ。 C++のSTLや.NET Fremeworkでも出てくる用語なので、一応知ってた。 英語でいうとpredicateね。 ...はい。で、本題。 「値が等しい」と一口…

Sir,Yes Sir!

鬼軍曹.el

認識の違い

自分は、「LISP」と言う言葉をLISP系言語の総称として使ってて、そのつもりで「LISPをみんなで勉強しよう!」に参加させてもらったんだけど、エントリはCommon Lispの内容ばかりで、Schemeのことを書く人がいない。 CLの人は「Lisp」という言葉を「CLの略称…

キーワードって何ぞ?

そういえば、キーワード引数のところ(82ページ)で、 キーワードは :名前 と、コロンの後に名前を書くことで作成できます。 とあった。 「作成できます」って書いてあるから、なにかが定義されるのかと思ったけど、そうではないみたい? 'hoge が (quote ho…

Lisp脳

大いに感動した。 手続的な発想では、毎回特殊な処理を行いそれを繰り返すという発想でプログラミングしていました。 Schemeプログラマはそうは考えません。 「データからデータへの変換を考えれば良く、出力は後からどうにでもなる」 と考えています。 「Li…

やってしもうた!

はい、イントネーションは「しも」を強く、高く。 やってしもうた! わたくし、快適なSchemeライフのため、先日Ubuntu@VMware@WinXPを捨ててUbuntuをネイティブインストール(っていうのかな?VMかまさずにやることね)したわけであります! そりゃぁ、もうS…

多値

これまた今までの文化に無いので、メリットが実感できない概念。 理解すんのは難しくなさそうだけどね。

部分適用

cutという構文を使うと (lambda (a) (func a x)) を (cut func <> x) って書けるそうだ。<>が引数になるような関数が作れる。 (cut func <> x) のcutを取っ払って (func <> x) にして、 さらに <> を引数にして (lambda (a) (func a x)) の出来上がり。 なん…

IMEのこと

MS-IMEはバックスラッシュを2回続けて打鍵すると「かな」から「半角英数」に切り替えれたりした。逆は無理だけど。 アレが癖になってしまってて、ATOKとかSCIMでいつも一瞬戸惑うんだよなぁー。 くっそー、へんな癖つけちまったよ。

キーワード引数

引数に関数を適用する際に、引数に名前みたいなもの(= キーワード)をつけられる。 そのおかげで、引数の順番を覚えておかなくてもよくなるらしい。引数が多い場合に便利そう? この概念は始めて出会うなぁ。スクリプト言語にはあったりするのかな。 ってこ…

省略可能引数

C++でもデフォルト引数ってのがあったけど、おんなじような機能で「省略可能引数」ってのがあるらしい。 使い方は (let-optionals* args ((名前1 値1) (名前2 値2) ... (名前n 値n)) let-optionals*式の値となるS式) argsの要素が先頭から順に名前1、名前2、…

ドットリスト、ドット対

いまいち理解しきれてない。使いどころが分からん。 例えば、 (define MIT->primitive (lambda (expr) (match expr (('define (func . args) . body) (list 'define func (list* 'lambda args body)))))) のmatchのパターンのところが、なぜ ('define (func …

バッファの移動

id:yagiey:20080409で紹介した.emacs.elの設定でずっとやってきたけど、C-cSで*scheme*バッファに移動するのがウザく感じるようになってきた。 Schemeやるときはscheme-modeにした*scratch*バッファでC-xC-eしてばっかりなので、*scheme*バッファに移動され…

パターンマッチ

組み込みのappend関数を実装すると次のようになる。 (define my-append (lambda args (cond ((null? args) '()) ((null? (cdr args)) (car args)) (else (append2 (car args) (apply my-append (cdr args))))))) (define append2 (lambda (a b) (if (null? a…

Ubuntu + Emacs + Gauche

普段使いのノートPCをWindows XPからUbuntuにした。 さっそくEmacs22とGaucheをインストール。 導入手順はid:yagiey:20080409に書いたりしてます。 emacs使い始めて、いきなりイラついたのが起動時のメッセージとビープ音。 ということで、両方とも消すため…

twittering-mode導入

注意:ここの内容は古くなっている可能性がありますので、最新の情報を探した方が良いと思われます。emacsはtwitterクライアントにもなっちゃうよ!ってことで、twittering-modeを導入。 手順は http://lambdarepos.svnrepository.com/share/trac.cgi/browse…

emacs22でC-spaceでのSCIMの起動を抑制

C-spaceするとSCIMが起動してウザい。 ってことで、C-spaceでSCIMが起動しないようにする方法。 Gnomeパネルのアイコンを右クリックしてプロパティを表示する コマンドを env XMODIFIERS=@im=none <emacsのパス> -i と書き換える。 参考:https://wiki.ubu…

Ubuntu8.10でCtrlキーとCapsLockキーを入れ替える

以下の手順でOK。 メニュー→「システム」→「設定」→「キーボード」で「キーボードの設定」ウィンドウを開く。 「レイアウト」タブ→「Other Options...」ボタンを押して「キーボード・レイアウトのオプション」ウィンドウを開く。 「Ctrl キーの位置」を選び…

複数引数をリストにして関数適用

applyという関数を使うと、 (some-function arg1 arg2 arg3 arg4) を (apply some-function '(arg1 arg2 arg3 arg4)) って書けますぜ、と。 可変長引数と相性が良いっぽい。こんな感じ。 gosh> (define make-logger (lambda (f) (lambda args (print "args="…

木構造をこねくり回す

7章4節の最後に、lambdaを使った関数定義とMIT形式の変換をやる関数が紹介されている。 特に練習問題ではないけど、自分で書いてみないと気が済まないのでやってみた。 gosh> (define primitive->mit (lambda (expr) (list (car expr) (cons (car (cdr expr)…

購読者

先日、tophatenarなるサイトを知った。 で、さっそく自分のはてダ見てみたら、なんと購読者が7人もいるじゃないですか。 思わず飲んでたカフェオレ吹きそうになった。 読んでくれる人が居るのは励みになりますなぁ。 大したことは書けませんが、今後ともよろ…

7章4節の練習問題

可変長引数関数の定義の仕方を参考に組み込みのlist関数を自分で実装しろ、と。 gosh> (define MyList (lambda arg arg)) MyList gosh> (MyList) () gosh> (MyList 1) (1) gosh> (MyList 1 2) (1 2) gosh> (MyList 1 2 3 4 5) (1 2 3 4 5) あまりにも簡単な…

可変長引数をとる関数の定義法

2個以上の引数を要求する関数 (lambda (a b . c) 定義) 使ってみる gosh> (define func (lambda (a b . c) (print "a=" a " b=" b " c=" c))) func gosh> (func 1 2) a=1 b=2 c=() gosh> (func 1 2 3) a=1 b=2 c=(3) gosh> (func 1 2 3 4) a=1 b=2 c=(3 4) g…

ローカル変数

let let* letrec の3つのタイプがあるそうだ。 使い方は全部同じで (let族 ((変数1 変数1を初期化するS式) (変数2 変数2を初期化するS式) ... (変数n 変数nを初期化するS式)) let族の値となるS式) ってな感じ。 「let族の値となるS式」の中で「変数1」〜「変…

λ計算おもしろい

Yコンビネータについてさっぱり理解できないまま終わってたけど、数学的な面から考えると分かりやすいような気がした。 F.Ko-Jiの「一秒後は未来」-Yコンビネータについて調べてみた λ式ではYコンビネータは λf.(λx.f(xx))(λx.f(xx)) って表現されるけど、こ…