結城浩のSICP日記 RSSフィード

2006-05-08

[]Windowsのコマンドプロンプトからinfoを使う Windowsのコマンドプロンプトからinfoを使う - 結城浩のSICP日記 を含むブックマーク

GaucheのinfoファイルをWindowsのコマンドプロンプトから読む方法です。

注意:とにかく使えればよいという汚い方法ですので、よりよい方法があったらご教示ください。

(1) info.scmを修正する

  • 場所: share\gauche\0.8.7\lib\gauche\interactive\info.scmの最後
  • 内容: 「*.infoファイルのあるディレクトリ」を追加(以下に例を示す)
(define (get-info-paths) '("C:/Gauche/info"))

(2) info.batを作成する

  • 場所: カレントディレクトリ。
  • 内容: 以下の通り。
@echo off
if "%1"=="" goto USAGE
set INFO_TMP=_info-tmp.scm
echo ;                                      >  %INFO_TMP%
echo (use gauche.interactive.info)          >> %INFO_TMP%
echo (define viewer (lambda (s) (print s))) >> %INFO_TMP%
echo (info '%1)                             >> %INFO_TMP%
echo (exit)                                 >> %INFO_TMP%
gosh -A . -b -l %INFO_TMP% | more
goto END
:USAGE
echo   Usage: info name
echo Example: info car
:END

これでinfoコマンドができました。試してみましょう。

> info stream?
11.44 `util.stream' - Stream library
====================================

 -- Module: util.stream
     This module provides a library of lazy streams, including the
     functions and syntaxes defined in srfi-40.
(以下略)

> info info
9.7 `gauche.interactive' - Utilities for interactive session
============================================================

 -- Module: gauche.interactive
     Provides useful utilities for the interactive session.

     This module is automatically loaded when you run `gosh'
     interactively.
(以下略)

うまくいきました♪

追記:

オンラインドキュメントの参照。id:tenyさんがEmacsの話題を書いていらっしゃいました。情報ありがとうございます。結城はバッチファイルで汚く解決してしまいましたが(^_^;

はてなRSS生成のバグ? はてなRSS生成のバグ? - 結城浩のSICP日記 を含むブックマーク

はてなの中の人へ:「結城浩のSICP日記」の読者さんから指摘があって、次のような症状が出ていることがわかりました。

  • 現象:特定の内容の記事を書くとRSSが正常に表示されない。
  • 推測した原因:RSSのdescriptionを生成するときのtruncateの仕方がまずく、実体参照の一文字目&の直後で切られてしまっているようだ。
  • 再現方法:>||と||<の間に非常にたくさん(100文字×12行)の ' を書き、RSSを表示させてみる。
  • 追記:「結城浩のはてな日記」では正常に動きましたので、はてなグループ日記固有の問題かもしれません。
  • 追記:2006-05-13 10:19に試したところ、再現しなくなっているようです。中の人が直してくださったのかもしれませんね。

Schemeの勉強、10日目 Schemeの勉強、10日目 - 結城浩のSICP日記 を含むブックマーク

早いもので、この「結城浩のSICP日記」を始めてから約10日間が過ぎました。現在思っていることを箇条書きします。

  • 勉強は楽しいな。
  • 「SICPの勉強」ではなく、Gaucheを使った「Schemeの勉強」になっている。でもまあいいや。
  • 初期の段階で教えられた大切なこと
  • 学習のポイントいろいろ
    • 初期の段階で識者からポイントを教えてもらうのはとてもよいことなので、勉強があまり進まないうちに「わたし、これについて勉強してます!」と宣言するのがよい。
    • 簡単なプログラムをちらっと見て、それを自分で再現する練習は理解チェックによい。
    • 自分の解答を人の解答と比べると、理解がとても進む。
    • 書く練習はよいけれど、そのとき「何を読んでいたか」も併記しておくとよい。
    • 「後で読みます」は結局読まないような。
    • 興味を持った問題を考えると集中して勉強できる(当たり前か)。
    • オンラインドキュメント重要。HTMLをCSSで整えるのはよい作業だった。
  • Schemeについて
    • (proc args)でprocのところも同じように評価されるというのは知らなかった。
    • プログラミングしながら、Rubyとの類似性を感じる。
    • 高階関数、楽しい。
    • 反復的な書き方、楽しい。
    • 継続渡しスタイル、楽しい。
    • 遅延評価、楽しい。
  • perldocやriやrefeのような、コマンドラインベースで読めるドキュメントツールがあるとよいなあ。以下のような感じ。仮にそのツールをsdocと呼ぶことにすると、以下のように表示されるの。
> sdoc stream?
Function: stream? obj
[SRFI-40] Returns #t iff obj is a stream created by a procedure of util.stream.

追記:shiroさんから「(info 'stream?) などとしてドキュメントが参照できます」という主旨のコメントをいただきました。ありがとうございます。ちょっと試してみました。

(use gauche.interactive.info)
;=> #<undef>

(info 'stream?)
*** ERROR: couldn't open input file: "/dev/null"
Stack Trace:
_______________________________________
  0  opener

  1  file

  2  error

  3  (append (cond ((string? command) `("/bin/sh" "-c" ,command)) ((lis ...
        At line 319 of "c:\\gauche\\share\\gauche\\0.8.7\\lib/gauche/process.scm"
  4  (apply-run-process command input :pipe err)
        At line 242 of "c:\\gauche\\share\\gauche\\0.8.7\\lib/gauche/process.scm"
  5  (process-output->string (string-append "" (x->string *gauche-confi ...
        At line 50 of "c:\\gauche\\share\\gauche\\0.8.7\\lib/gauche/config.scm"
  6  (gauche-config "--infodir")
        At line 82 of "c:\\gauche\\share\\gauche\\0.8.7\\lib/gauche/interactive/info.scm"
  7  (get-info-paths)
        At line 87 of "c:\\gauche\\share\\gauche\\0.8.7\\lib/gauche/interactive/info.scm"
  8  (find-info-file)
        At line 98 of "c:\\gauche\\share\\gauche\\0.8.7\\lib/gauche/interactive/info.scm"
  9  (open-info-file (find-info-file))
        At line 98 of "c:\\gauche\\share\\gauche\\0.8.7\\lib/gauche/interactive/info.scm"

なるほど、何が起こっているか、雰囲気はわかりました。少しhackすると何かできそうですね。いつも情報ありがとうございます。そうか、infoファイルはあるんだから、Windowsのコマンドラインで動くinfoツールを探せばよいだけかも…。

追記:

Windowsのコマンドプロンプトからinfoを使う

fold fold - 結城浩のSICP日記 を含むブックマーク

foldを作る練習。

最初、反復的な内部関数を作りかけたのだが、実はfoldはこれ自身が反復的な関数であることに気づいた。

(define (fold proc result lis)
  (cond ((null? lis)
          result)
        (else
          (fold proc
            (proc (car lis) result)
            (cdr lis)))))

(fold + 0 '(1 2 3 4 5 6))
;=> 21

(fold cons '() '(a b c d e))
;=> (e d c b a)

[]p.192:stream-map p.192:stream-map - 結城浩のSICP日記 を含むブックマーク

問題3.50を考えた。

  • stream-mapを作る。
  • まずは一引数版stream-map-1を作る。
  • 結果もstreamになる。つまりstream-cdrするまでは後は評価しない。
(use util.stream)

(define (stream-map-1 f s)
  (cond ((stream-null? s)
          stream-null)
        (else
          (stream-cons
            (f (stream-car s))
            (stream-map-1 f (stream-cdr s))))))

(define (stream-integer start)
  (stream-cons
    start
    (stream-integer (+ start 1))))

(define s (stream-integer 0))
(define t (stream-map-1 (lambda (x) (* x 2)) s))

(stream-car t)
;=> 0

(stream-cadr t)
;=> 2

(stream-caddr t)
;=> 4

(stream-cadddr t)
;=> 6
  • 次に任意引数版stream-map-sを作る。
  • 任意引数というのはストリームを任意個渡せるという意味。
  • stream-null, stream-cons, stream-car, stream-cdrはモジュールutil.streamから借りる。
(use util.stream)

(define (stream-map-s f . ss)
  (cond ((null? ss)
          stream-null)
        (else
          (stream-cons
            (apply f
              (map stream-car ss))
            (apply stream-map-s
              (cons f (map stream-cdr ss)))))))

(define (stream-integer start)
  (stream-cons
    start
    (stream-integer (+ start 1))))

(define s (stream-integer 0))
(define t (stream-integer 100))
(define u (stream-map-s + s t))

(stream-car u)
;=> 100

(stream-cadr u)
;=> 102

(stream-caddr u)
;=> 104

(stream-cadddr u)
;=> 106

shiroshiro2006/05/08 09:27一応、goshからも対話的に (info 'stream?) などとしてドキュメントが参照できます。但し、Unix環境を仮定しているのでmingwではたぶん動きません (cygwinなら動きます)。それと、該当関数だけでなくてそれが含まれるinfoファイルのページを表示するのでちょっと使いにくいかもしれません。

通りすがり通りすがり2006/05/08 13:55ThunderBirdのRSSリーダーで読もうと思ったのですがエラーになってしまいます。Firefoxでhttp://sicp.g.hatena.ne.jp/hyuki/rssを直接開いてもエラーになるようです。

hyukihyuki2006/05/08 15:19通りすがりさん、情報ありがとうございます。RSSを見てみると、以下のようになっていました。
<description>ここに文章がはいる...&</description>
という状況になっていました。もとの文章は、
<description>ここに文章がはいる...'</description>
となっています。RSSのdescriptionを構成するとき、はてなのRSS作成モジュールは、文章の末尾を切り捨てるらしいのですが、ちょうど切断面に「"」が登場すると、&の直後「quot;」が切り捨ててられているようです。
> はてなさんへ連絡(って、どうすればよいのだろう…

通りすがり通りすがり2006/05/09 01:12ありがとうございます。無事RSS購読ができました。
しばらく前にSICPを購入したのですがなかなか読み進めていません。やはり実際にプログラムを動かしてみなければ…。