For Gauche 0.9.5


Next: , Previous: , Up: Gaucheでのプログラミング   [Contents][Index]

3.2 インタラクティブな開発

スクリプトファイルが与えられなかった場合、 goshはインタラクティブなread-eval-printループ(REPL)に入ります。

インタプリタを終了するには、EOF文字(Unix端末では通常Control-D)をタイプするか、 (exit)を評価します。

インタラクティブセッションでは、goshgauche.interactiveモジュールをロードします (インタラクティブセッション参照)。 このモジュールはまた、ユーザーのホームディレクトリに.gauchercという ファイルがあればそれをロードします。 インタラクティブデバッグに便利な設定をそこに書いておくことができます。 (Gauche release 0.7.3から、.gauchercはgoshがスクリプトモードで 起動された時は読まれなくなりました。)

.gauchercは常にuserモジュールへとロードされます (gosh-r7オプションつきで起動されていてもそうです)。 .gauchercを自動で読み込む、という機能自体がGauche特有の機能ですから、 そこでポータビリティを考慮する必要はないわけです。

goshをEmacs内部で走らせることをお勧めします。 EmacsはSchemeサブプロセスを操作するための豊富な機能を持っています。 次の行を.emacsに加えておくと、M-x run-scheme で Emacsのバッファ内でgoshが走ります。

(setq scheme-program-name "gosh -i")

対話環境でマルチバイト文字を使う場合は、端末の文字エンコーディングをgoshの 内部エンコーディングと合わせるようにして下さい。


Previous: , Up: インタラクティブな開発   [Contents][Index]

3.2.1 REPLでの開発

REPLに入ると、Gaucheはプロンプトを出してScheme式の入力を待ちます。

gosh>

完全なScheme式を入力してENTERをタイプすると、そのS式の評価結果が表示されます。

gosh> (+ 1 2)
3
gosh> 

REPLセッションは、過去3回分の評価結果をグローバル変数 *1*2*3 に束縛します。これらのヒストリ変数を 使って、以前の結果を後続の式の中で使えます。

gosh> *1
3
gosh> (+ *2 3)
6

Scheme式が複数の値を返した場合 (多値参照)は、各値が順に表示されます。

gosh> (min&max 1 -1 8 3)
-1
8
gosh> 

式が多値を返しても、変数*1*2*3 に束縛されるのは最初の値のみです。しかし別のグローバル変数 *1+*2+*3+に、全ての値をリストにしたものが 束縛されています。

gosh> *1
-1
gosh> *2+
(-1 8)

(上の例で、*1を評価した時点でヒストリがひとつずれてしまっていることに 注意してください。(min&max 1 -1 8 3)の結果を見るためには *2+を参照する必要があります。)

手続き*historyはヒストリ変数の値を表示します。

gosh> (*history)
*1: (-1 8)
*2: -1
*3: -1
gosh> 

特別な場合として、式の評価がゼロ個の値を返した場合は、ヒストリ変数は更新されません。 *history手続きはゼロ個の値を返すので、ヒストリを見るだけでヒストリが 進んでしまうということはありません。

gosh> (*history)
*1: (-1 8)
*2: -1
*3: -1
gosh> (values)
gosh> (*history)
*1: (-1 8)
*2: -1
*3: -1

最後に、評価途中で捕捉されないエラーが発生した場合は、エラーコンディションオブジェクトが グローバル変数*eに束縛されます。

gosh> (filter odd? ’(1 2 x 4 5))
*** ERROR: integer required, but got x
Stack Trace:
_______________________________________
  0  (eval expr env)
        At line 173 of "/usr/share/gauche-0.9/0.9.3.3/lib/gauche/interactive.scm"
gosh> *e
#<error "integer required, but got x">

(エラースタックトレースの表示はインストールの状況によって異なる場合があります。)

REPLプロンプトではまた、よくある仕事のために、特別なトップレベルコマンドを 入力することもできます。トップレベルコマンドはScheme式ではありませんし、S式でさえ ありません。むしろ、伝統的な行指向のシェルコマンドのように動作します。

トップレベルコマンドは通常のScheme式と区別するために、コンマで始まります。 どういったコマンドが使えるかを見るには、,helpとタイプしてリターンを 入力してみてください。

gosh> ,help
You're in REPL (read-eval-print-loop) of Gauche shell.
Type a Scheme expression to evaluate.
A word preceeded with comma has special meaning.  Type ,help <cmd> 
to see the detailed help for <cmd>.
Commands can be abbreviated as far as it is not ambiguous.

 ,a|apropos  Show the names of global bindings that match the regexp.
 ,cd         Change the current directory.
 ,doc|info   Show info document for an entry of NAME.
 ,d|describe Describe the object.
 ,history    Show REPL history.
 ,h|help     Show the help message of the command.
 ,pwd        Print working directory.
 ,source     Show source code of the procedure if it's available.

それぞれのコマンド特有のヘルプを見るには、コンマを含まないコマンド名を helpコマンドに与えてください。

gosh> ,help d
Usage: d|describe [object]
Describe the object.
Without arguments, describe the last REPL result.

,d (あるいは,describe)トップレベルコマンドは与えられたSchemeオブジェクト、 または何もオブジェクトが与えられなければ直前の結果のオブジェクトについて、 その説明を表示します。ちょっと試してみましょう。

gosh> (sys-stat "/home")
#<<sys-stat> 0x2d6adc0>
gosh> ,d
#<<sys-stat> 0x2d6adc0> is an instance of class <sys-stat>
slots:
  type      : directory
  perm      : 493
  mode      : 16877
  ino       : 2
  dev       : 2081
  rdev      : 0
  nlink     : 9
  uid       : 0
  gid       : 0
  size      : 208
  atime     : 1459468837
  mtime     : 1401239524
  ctime     : 1401239524

上の例では、まず(sys-stat "/home")を評価して、結果として <sys-stat>オブジェクトが返ってきました。続く,dコマンドによって その<sys-stat>オブジェクトの詳細が表示されています。

表示される情報はオブジェクトの型に依存します。型によっては、追加の情報が 表示される場合もあります。例えば正確な整数をdescribeすると、 いくつかの異なる解釈が示されます。

gosh> ,d 1401239524
1401239524 is an instance of class <integer>
  (#x538537e4, ~ 1.3Gi, 2014-05-28T01:12:04Z as unix-time)
gosh> ,d 48
48 is an instance of class <integer>
  (#x30, #\0 as char, 1970-01-01T00:00:48Z as unix-time)

シンボルをdescribeすると、分かっている束縛が示されます。

gosh> ,d 'filter
filter is an instance of class <symbol>
Known bindings for variable filter:
  In module `gauche':
    #<closure (filter pred lis)>
  In module `gauche.collection':
    #<generic filter (2)>

手続きをdescribeした場合、もし分かっていればそのソースコード上の 場所も表示されます(Defined at ...の行):

gosh> ,d string-interpolate
#<closure (string-interpolate str :optional (legacy? #f))> is an
instance of class <procedure>
Defined at "../lib/gauche/interpolate.scm":64
slots:
  required  : 1
  optional  : #t
  optcount  : 1
  locked    : #f
  currying  : #f
  constant  : #f
  info      : (string-interpolate str :optional (legacy? #f))
  setter    : #f

他のトップレベルコマンドも見てみましょう。,infoコマンドは 手続き、変数、構文、モジュールもしくはクラス名が与えられると、そのドキュメントを 表示します。(テキストはシステムにインストールされたGaucheのinfoドキュメントから 検索されます。もしエラーが出た場合は、infoドキュメントが正しくインストール されているかどうか確認してください。)

gosh> ,info append
 -- Function: append list ...
     [R7RS] Returns a list consisting of the elements of the first LIST
     followed by the elements of the other lists.  The resulting list is
     always newly allocated, except that it shares structure with the
     last list argument.  The last argument may actually be any object;
     an improper list results if the last argument is not a proper list.

gosh> ,info srfi-19
 -- Module: srfi-19
     This SRFI defines various representations of time and date, and
     conversion methods among them.

     On Gauche, time object is supported natively by '<time>' class
     (*note Time::).  Date object is supported by '<date>' class
     described below.

gosh> ,info <list>
 -- Builtin Class: <list>
     An abstract class represents lists.  A parent class of '<null>' and
     '<pair>'.  Inherits '<sequence>'.

     Note that a circular list is also an instance of the '<list>'
     class, while 'list?' returns false on the circular lists and dotted
     lists.
          (use srfi-1)
          (list? (circular-list 1 2)) => #f
          (is-a? (circular-list 1 2) <list>) => #t

,a (または,apropos) は、与えられた名前や正規表現に マッチするグローバルな識別子を表示します。

gosh> ,a filter
filter                         (gauche)
filter!                        (gauche)
filter$                        (gauche)
filter-map                     (gauche)

註: aproposコマンドは現在のプロセスにロードされている名前のみから 検索します。一方、infoコマンドは現在のプロセスにロードされているかどうか とは関係なく、infoドキュメントから検索します。

註: gosh-qオプション (初期化ファイルをロードしない) で 起動した場合もREPLに入りますが、そこではヒストリ変数などは使えません。 REPLの便利機能はgauche.interactiveモジュールで実装されていますが、 -qオプションをつけるとgauche.interactiveがロードされないからです。


Previous: , Up: インタラクティブな開発   [Contents][Index]