atom?

関数 atom? は任意のS式を引数に取り、それがアトムであるとき真(#t)を返す。といっても Gauche に atom? は用意されていないので、まずは脚注にある定義を写経。

gosh> (define atom?
  (lambda (x)
    (and (not (pair? x)) (not (null? x)))))
atom?

関数の定義の仕方は、本文で触れていないのでここでも触れない。そのうち出てくるだろう。

さあ、試してみよう。

gosh> (atom? 'Harry)
#t
gosh> (atom? '(Harry had a heap of apples))
#f
gosh> (atom? (car '(Harry had a heap of apples)))
#t
gosh> (atom? (cdr '(Harry had a heap of apples)))
#f
gosh> (atom? (cdr '(Harry)))
#f

最後の例では、(cdr '(Harry)) が 空リストなので偽(#f)なのだな。

null?

関数 null? は引数が空リストのとき真(#t)を返す。

gosh> (null? '())
#t
gosh> (null? (quote ()))
#t
gosh> (null? '(a b c))
#f

(quote ())'() の別の書き方。最後の例では、引数が空リストでないので偽(#f)が返ってきている。

本文には「アトムの null? をたずねることはできません」とあるけど、脚注には「実際、(null? α) は空リスト以外はすべて偽になります。」とある。

gosh> (null? 'spaghetti)
#f

Null? の掟
関数 null? はリストに対してのみ定義される。

cons

関数 cons は任意のS式をリストの先頭に付け加える。

gosh> (cons 'peanut '(butter and jelly))
(peanut butter and jelly)
gosh> (cons '(banana and) '(peanut butter and jelly))
((banana and) peanut butter and jelly)

cons は2つの引数をとり、ひとつ目は任意のS式、ふたつ目はリストでなければならない。

gosh> (cons 'a 'b)
(a . b)

あれ、エラーにならないな。リストともちょっと違う。なんだかわからないけど、そのうち出てくるだろう。それまでは保留。
脚注には、「実際、(cons α β) はすべての値αとβにうまく働いて、(car (cons α β))=α、(cdr (cons α β))=β となります。」とある。

gosh> (car (cons 'a 'b))
a
gosh> (cdr (cons 'a 'b))
b

Cons の掟
関数 cons は2つの引数を取る。
cons の第2引数はリストでなければならない。
結果はリストとなる。

carとcdr

car

関数 car はリストの中の最初のS式を返す。

gosh> (car '(a b c))
a
gosh> (car '((a b c) x y z))
(a b c)

アトムや空リストに適用するとエラーになる。

gosh> (car 'atom)
*** ERROR: pair required, but got atom
Stack Trace:
_______________________________________
gosh> (car '())
*** ERROR: pair required, but got ()
Stack Trace:
_______________________________________

Car の掟
関数 car は空でないリストに対してのみ定義される。

cdr

関数 cdr (クダーと読む)はリストの中から最初のS式を取り除いた、残りのリストを返す。

gosh> (cdr '(a b c))
(b c)
gosh> (cdr '((a b c) x y z))
(x y z)
gosh> (cdr '(hamburger))
()

S式がひとつしかないリストの場合には、空リストが返ってくるんだな。

アトムや空リストに適用すると、エラーになる。

gosh> (cdr 'atom)
*** ERROR: pair required, but got atom
Stack Trace:
_______________________________________
gosh> (cdr '())
*** ERROR: pair required, but got ()
Stack Trace:
_______________________________________

Cdr の掟
関数 cdr は空でないリストについてのみ定義される。
空でないリストの cdr は常に別のリストになる。

アトムとリストとS式

Scheme ではすべてはS式だ。基本的なデータも、リストも、関数も全部、S式。
アトムもS式。アトムというのは、Scheme での最小単位のようなものらしい。括弧ではない文字からなる文字列(データとしての文字列とは違うことに注意)や数字の列がアトム。ちょっと確かめてみよう。

gosh> atom
*** ERROR: unbound variable: atom
Stack Trace:
_______________________________________

あれ、エラーになった。そうか、クォートしてやらないといけない。クォートすると文字の列をそのものとして扱ってくれる。

gosh> 'atom
atom
gosh> 12345
12345
gosh> '*abc$
*abc$

リストは、S式を括弧でくくったもの。リスト自体もS式なので、リストのリストも作ることができる。これも当然S式。

gosh> '(x y z)
(x y z)
gosh> '((x y) z)
((x y) z)
gosh> '()
()

最後のは空のリスト。これもS式。

Schemeをはじめようと思う

巳年も終わったから Python も終わり、というわけでは決してないのだけど、新しい年には新しい言語を、ということで以前ちょっとだけ触ったことのある Scheme をはじめようと思う。
Windows で動作する Scheme 処理系はWindows 野郎のための Scheme 処理系 ― 年金ロボットをめざしてでいくつか紹介されているけど、あえて紹介からはずされている Gauche を使うことにする。理由は簡単、以前触った Scheme というのが Gauche だからだ。

まずは Gauche のインストールから。↓このページから Windows用バイナリインストーラをダウンロードした。バージョンは0.9.3.3。
 cf. http://practical-scheme.net/gauche/download-j.html
msi形式のインストーラなので、ダブルクリックして起動すればあとはすんなりとインストールできた。

コマンドプロンプトを起動して、goshと入力するとインタープリタがインタラクティブモードで起動する。

^o^ > gosh
gosh>

ここでいろいろ試してみればいいわけだな。

参考書には有名な「Scheme手習い」を使う。これまたずいぶん前に買ったきりほとんど読んでない本で、奥付には平成22年10月25日第1版第1刷発行とある。
[amazonjs asin=”4274068269″ locale=”JP” title=”Scheme手習い”]

それから、Gauche のオンラインマニュアルのページはここ。
 cf. Gauche ユーザリファレンス

さあ、はじめよう。

NokogiriがダメだったのでHpricotをインストールした

タイトルのとおり。Hpricot はすんなりインストールできた。

^o^ > gem install hpricot
Fetching: hpricot-0.8.6.gem (100%)
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
Successfully installed hpricot-0.8.6
Parsing documentation for hpricot-0.8.6
unable to convert "\x90" from ASCII-8BIT to UTF-8 for lib/fast_xs.so, skipping
unable to convert "\x90" from ASCII-8BIT to UTF-8 for lib/hpricot_scan.so, skipp
ing
Installing ri documentation for hpricot-0.8.6
1 gem installed

でも、もともと Hpricot を使ってたのを Nokogiri に乗り換えたんだよなあ。

一応、簡単なスクリプトを書いてちゃんと動くかどうか試してみよう。

require 'hpricot'

HTML =<<

Hello, world. This is <a href="https://blog.panicblanket.com/">blog.PanicBlanket.com</a>

EOH

doc = Hpricot(HTML)
links = doc.search("a")
puts links[0]["href"]

実行結果:

^o^ > ruby hpricot_test.rb
https://blog.panicblanket.com/

うまくいってるようだ。

Windows7のRubyにNokogiriがインストールできない

年末年始の休みも(気分的に)終わったので、Nokogiri のインストールに挑戦する。前回のエントリは MinGW をインストールしたところで終わったけど、正常にインストールできていないように見えるので不安。
で、結果から先に言ってしまうと、Nokogiri はインストールできなかった。できなかったというエントリを書く必要があるのかどうか悩むところだけど、メモのために記録を残しておく。
基本は、↓このページに沿って作業した。

 cf.WindowsのRuby 2.0でNokogiriを使う ― KaoriYa

と、その前に、gcc と sh のあるディレクトリにパスを通しておく。具体的には、C:\MinGW\bin と C:\MinGW\msys\1.0\bin にパスを通した。
でもって、msys.bat を起動して作業開始。ところが、sh ./configure のときから gcc が次のようなメッセージを出す。

nodisk

仕方がないので「続行」をクリックすると、またすぐに同じメッセージが。これを数十回も繰り返してやっと終わったと思ったら make でもやっぱり同じメッセージが数十回も出た。あー、こりゃうまくいかないな。
結局、libxml2 でも libxslt でも同じ状況で、当然 Nokogiri のインストールもうまくいかずじまい。
Ruby を使うのもだんだんつらくなってくるなあ。

Windows7にMinGWがインストールできない?

※ 追記あり

gem で nokogiri をインストールしようとしたところ、次のようなエラーが出てインストールできなかった。

^o^ > gem install nokogiri
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
ERROR:  Error installing nokogiri:
        ERROR: Failed to build gem native extension.

    C:/Ruby200-x64/bin/ruby.exe extconf.rb
checking for libxml/parser.h... no
-----
libxml2 is missing.  please visit http://nokogiri.org/tutorials/installing_nokog
iri.html for help with installing dependencies.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=C:/Ruby200-x64/bin/ruby
        --with-zlib-dir
        --without-zlib-dir
        --with-zlib-include
        --without-zlib-include=${zlib-dir}/include
        --with-zlib-lib
        --without-zlib-lib=${zlib-dir}/lib
        --with-iconv-dir
        --without-iconv-dir
        --with-iconv-include
        --without-iconv-include=${iconv-dir}/include
        --with-iconv-lib
        --without-iconv-lib=${iconv-dir}/lib
        --with-xml2-dir
        --without-xml2-dir
        --with-xml2-include
        --without-xml2-include=${xml2-dir}/include
        --with-xml2-lib
        --without-xml2-lib=${xml2-dir}/lib
        --with-xslt-dir
        --without-xslt-dir
        --with-xslt-include
        --without-xslt-include=${xslt-dir}/include
        --with-xslt-lib
        --without-xslt-lib=${xslt-dir}/lib
        --with-libxslt-config
        --without-libxslt-config
        --with-pkg-config
        --without-pkg-config
        --with-libxml-2.0-config
        --without-libxml-2.0-config
        --with-pkg-config
        --without-pkg-config
        --with-libiconv-config
        --without-libiconv-config
        --with-pkg-config
        --without-pkg-config


Gem files will remain installed in C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/nokog
iri-1.6.1 for inspection.
Results logged to C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/nokogiri-1.6.1/ext/nok
ogiri/gem_make.out

調べてみると、どうやら nokogiri はもはや Pure Ruby ではなく、おまけにほかのCライブラリに依存するらしい。
Windows の Ruby 2.0.0 に nokogiri をインストールする方法はこのページに詳しい。

 cf. WindowsのRuby 2.0でNokogiriを使う ― KaoriYa

というわけで、ここからが今日の本題。C のライブラリをビルドするためにまずは MinGW のインストールに挑戦する。
まずは、ダウンロードページから mingw-get-setup.exe をダウンロード。これを右クリックして管理者として実行する。
順調に進むかと思いきや、「”C:\MinGW\libexec\mingw-get\shlink.js” のスクリプト エンジン “JScript” が見つかりません。」というエラーがでてしまう。先週、有効にしたはずなのにおかしい。
とりあえず「OK」をクリックすると MinGW Installation Manager というパッケージ管理ツールのウィンドウが開く。ここでインストールしたいパッケージを選んで(よくわからんので Basic Setup にあるすべてを選んだ)、メニューから Installation → Apply Changes をクリックするとインストールが始まって、しばらくすると無事終わった(ように見える)。
ところが、スタートメニューにもデスクトップにもショートカットが作成されていない。これってやっぱり正常にインストールされてないってことか?

試しに簡単なプログラムを書いてみた。

#include

main () {
    printf("Hello, world.\n")
}

実行結果:

^o^ > gcc -o hello.exe hello.c

^o^ > hello.exe
Hello, world.

なんと、コンパイルができてしまった。どういうこと?

[追記]
gcc が使えたのは、MinGW が正常にインストールされているわけじゃなかった。Haskell Platform に含まれてる gcc が動いていた。

^o^ > which gcc
C:/Program Files (x86)/Haskell Platform/2012.4.0.0/mingw/bin/gcc.EXE

MinGW のほうにパスを通せばいいのかなあ。shlink.js が何をやってるのか調べてみようか。

スクリプト エンジン “JScript” が見つかりません。

Windows7 Home Premium での話。
以前 JScript で書いたスクリプトを実行しようとしたら、次のようにエラーになった。

^o^ > cscript arg1.js foo bar baz
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

CScript エラー: スクリプト "C:\Users\takatoh\Documents\w\sandbox\wsh\arg1.js" のス
クリプト エンジン "JScript" が見つかりません。

ググってみたらYahoo知恵袋の↓このページを見つけた。

 cf. http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13100243473

以下、作業のメモとして残しておく。
まず、コマンドプロンプトを管理者権限で起動する。スタート → プログラム → アクセサリ → コマンドプロンプト、を右クリックして、「管理者として実行」。で、次のようにコマンドを打ち込む。

^o^ > regsvr32 jscript.dll

すると、「jscript.dll の DllRegisterServer は成功しました。」というダイアログが出るので「OK」をクリック。これで JScript が動くようになる。

^o^ > cscript arg1.js foo bar baz
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

foo
bar
baz

Yahoo知恵袋の記事では、JScriptが損傷してるとか書いてあるけど、心当たりが無い。もしかしたら何かのときに損傷したのかも。

ちなみに、VBScript も同じ状態。

^o^ > cscript arg.vbs foo bar baz
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

CScript エラー: スクリプト "C:\Users\takatoh\Documents\w\sandbox\wsh\arg.vbs" のス
クリプト エンジン "VBScript" が見つかりません。

同じやり方では復旧できなかった。なんで?

^o^ > regsvr32 vbscript.dll

これで、成功したとダイアログには出る。が、実際にスクリプトを実行してみるとダメ。

^o^ > cscript args.vbs foo bar baz
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

CScript エラー: スクリプト "C:\Users\takatoh\Documents\w\sandbox\wsh\args.vbs" のス
クリプト エンジン "VBScript" が見つかりません。

まあ、VBScriptは使わないからいいか。