GHCiのコマンドは全て「:
」ではじまり、一つのコマンド名とそれに続く零個以上のパラメータから成る。コマンド名は短縮することができ、曖昧な場合はより一般的に使われるコマンドが優先される。
:abandon
実行中の評価を捨てる。(ブレークポイントでの停止中のみ有効)
:add
[*
]module
...
module
を現在のターゲット集合に追加し、リロードを行う。通常、可能ならそのモジュールのコンパイル済みコードがロードされ、そうでなければそのモジュールはバイトコードにコンパイルされる。接頭辞*
を使うことでモジュールがバイトコードとしてロードされることを強制できる。
:back
履歴中を一つ戻る。2.5.5. 追跡と履歴を見よ。:trace
、:history
、:forward
も参照。
:break [identifier
| [module
] line
[column
]]
指定された関数、または指定された行の指定された位置にブレークポイントを設定する。2.5.1.1. ブレークポイントを設定するを見よ。
:browse
[!
] [[*
]module
] ...
module
からエクスポートされている識別子を表示する。module
は、GHCiにロードされているか、パッケージの要素でなければならない。module
が省略された場合、直近にロードされたモジュールが使われる。
GHCiのコマンド全てと同様に、出力はGHCiの現在のスコープ(2.4.5. プロンプトで実際にスコープにあるのは何か)で表示される。
browseコマンドには二つの変種がある。
*
記号がモジュール名の前に置かれたときは、module
でスコープにある全ての識別子が(エクスポートされたものだけでなく)表示される。
*
形式は解釈実行されているモジュールに対してのみ有効である。コンパイル済みモジュール(パッケージ由来のモジュールも含む)に対しては非*
形式の:browse
のみが利用可能である。
データ構築子やクラスメソッドは通常データ型宣言やクラス宣言の一部として表示される。しかし、このコマンドの後ろに!
記号が置かれた場合、これらが個々に表示される。!
の形式は、さらに、項目をグループに分けて、それぞれについて可能なインポートについてのコメントを付加する。例を示す。
Prelude> :browse! Data.Maybe -- not currently imported Data.Maybe.catMaybes :: [Maybe a] -> [a] Data.Maybe.fromJust :: Maybe a -> a Data.Maybe.fromMaybe :: a -> Maybe a -> a Data.Maybe.isJust :: Maybe a -> Bool Data.Maybe.isNothing :: Maybe a -> Bool Data.Maybe.listToMaybe :: [a] -> Maybe a Data.Maybe.mapMaybe :: (a -> Maybe b) -> [a] -> [b] Data.Maybe.maybeToList :: Maybe a -> [a] -- imported via Prelude Just :: a -> Maybe a data Maybe a = Nothing | Just a Nothing :: Maybe a maybe :: b -> (a -> b) -> Maybe a -> b
この出力が示すのは、現在のセッションの文脈(Prelude
のスコープ)で、Data.Maybe
の項目の最初の一団はスコープになく(ただしGHCiセッションでは完全修飾された形で利用できる。2.4.5. プロンプトで実際にスコープにあるのは何かを見よ)、二番目の一団は(Prelude
を介して)スコープにあり、修飾なし、あるいはPrelude.
という修飾子付きの形式で利用できる、ということである。
:cd
dir
作業ディレクトリをdir
に変更する。dir
の先頭が「˜
」記号の場合、それはHOME
環境変数の内容で置き換えられる。現在の作業ディレクトリを表示することについては:show paths
コマンドも見よ。
注意: ディレクトリを変更すると、ロードされているモジュールは全て未ロードになる。これは、探索パスがふつう相対ディレクトリを使って表されており、また、セッションの途中で探索パスを変更することがサポートされていないためである。
:cmd
expr
expr
をIO String
型の計算として実行し、その結果の文字列をGHCiコマンドのリストとして実行する。複数のコマンドは改行で区切る。:cmd
コマンドは:def
および:set stop
と組み合わせて使うのに便利である。
:complete
type
[n
-][m
] string-literal
このコマンドは、GHCiが正規のターミナルでなくパイプを通してやりとりをしている場合でもコマンド補完を可能にするものであり、GHCiの補完をテキストエディタやIDEに統合するために設計されている。
:complete
は、呼ばれたとき、string-literal
という不完全な入力に対する領域type
用の補完候補のうちn
番目からm
番目までのものを表示する。現在対応している領域はrepl
のみであり、これはGHCiの入力プロンプトで対話的に提供される種類の補完を意味する。
省略された場合、デフォルトでn
とm
はそれぞれ最初と最後の利用可能な補完候補になる。この引数によって指定される範囲よりも少ない補完候補しかない場合、n
とm
は、補完候補の数まで暗黙に切り詰められる。
:complete
の出力は、以下の三つのフィールドを空白区切りで含むヘッダ行から始まる。
l
を表す整数。ヘッダ行の後には、l
行が続く。それぞれの行には、一つの補完候補が(クォート付きの)文字列リテラルとしてエンコードされて含まれる。いろいろな場合の起動例をいくつかここに示す。
Prelude> :complete repl 0 "" 0 470 "" Prelude> :complete repl 5 "import For" 5 21 "import " "Foreign" "Foreign.C" "Foreign.C.Error" "Foreign.C.String" "Foreign.C.Types" Prelude> :complete repl 5-10 "import For" 6 21 "import " "Foreign.C.Types" "Foreign.Concurrent" "Foreign.ForeignPtr" "Foreign.ForeignPtr.Safe" "Foreign.ForeignPtr.Unsafe" "Foreign.Marshal" Prelude> :complete repl 20- "import For" 2 21 "import " "Foreign.StablePtr" "Foreign.Storable" Prelude> :complete repl "map" 3 3 "" "map" "mapM" "mapM_" Prelude> :complete repl 5-10 "map" 0 3 ""
:continue
ブレークポイントで停止しているとき、実行中の評価を再開する。
:ctags
[filename
] :etags
[filename
]
Vi風のエディタ用(:ctags
)またはEmacs風エディタ用(:etags
)のタグファイルを生成する。ファイル名が指定されなかった場合は、それぞれデフォルトのtags
またはTAGS
が使われる。ロードされているモジュール内の全ての関数、構築子、型のタグが作られる。これらのコマンドが働くには、全てのモジュールが解釈実行されていなければならない。
:def[!] [name
expr
]
:def
は、GHCiにおいて新しいコマンド(マクロと言ってもいい)を定義するのに使われる。コマンド:def
name
expr
は、新しいGHCiコマンド:
を、Haskellの式name
expr
で実装されたものとして定義する。式の型はString -> IO String
でなければならない。:
がプロンプトに入力されると、GHCiは式name
args
(
を走らせ、結果のname
args
)String
を受け取り、それをコマンドの列として再びGHCiに入力する。結果においては、隣り合うコマンドは「\n
」で区切られていなければならない。
これは少々ややこしいので、いくつか例を挙げる。まず、次に示す新しいGHCiコマンドは、引数を取らず、結果を生成せず、単に現在の日時を出力するだけのものである。
Prelude> let date _ = Time.getClockTime >>= print >> return "" Prelude> :def date date Prelude> :date Fri Mar 23 15:16:40 GMT 2001
引数を取るコマンドの例を示す。これは:cd
の再実装である。
Prelude> let mycd d = Directory.setCurrentDirectory d >> return "" Prelude> :def mycd mycd Prelude> :mycd ..
あるいは、現在のディレクトリで「ghc --make Main
」を起動する単純な方法を定義することもできる。
Prelude> :def make (\_ -> return ":! ghc --make Main")
GHCiへの入力をファイルから読み込むコマンドを定義することもできる。これは、あらかじめ決まった束縛を繰り返しGHCiセッションにロードしたいというときに便利かもしれない。
Prelude> :def . readFile Prelude> :. cmds.ghci
このコマンドの名前は:.
であるが、これは「.
」(同じことをするUnixシェルのコマンド)のアナロジーである。
:def
と単独で入力すると、現在定義されているマクロの一覧を表示する。既に存在するコマンド名を再定義しようとすると失敗する。ただし:def!
の形式が使われた場合は別で、この場合その名前の古いコマンドは黙って失われる。
:delete * | num
...
ブレークポイントを番号で指定して削除する。(それぞれのブレークポイントの番号を見るには:show breaks
を使う)。*
の形式では、ブレークポイントを全て削除する。
:edit [file
]
エディタを開いて、file
、それが省略されたときは直近にロードされたモジュールを編集する。起動されるエディタはEDITOR
環境変数から採られるか、EDITOR
が設定されていないときはシステムのデフォルトエディタが使われる。使われるエディタは:set editor
で変更することができる。
:etags
:ctags
を見よ。
:force identifier
...
identifier
の値を:print
と同じ方法で表示する。:print
と異なり、:force
は、値をたどっていく間に出会ったサンクを評価する。これによって、例外や無限ループが発生したり、別のブレークポイント(これは無視されるが、その旨表示される)に当ったりするかもしれない。
:forward
履歴中で前進する。2.5.5. 追跡と履歴を見よ。:trace
、:history
、:back
も参照。
:help
,
:?
利用可能なコマンドの一覧を表示する。
:
前のコマンドを繰り返す。
:history [num
]
評価ステップの履歴を表示する。数値が与えられると、その数のステップを表示する(デフォルト: 20)。:trace
と組み合わせて使う。2.5.5. 追跡と履歴を見よ。GHCiが保存する履歴の数を設定するには-fghci-hist-size=
を使う。n
:info
[!
]name
...
与えられた名前についての情報を表示する。例えば、もしname
がクラスなら、クラスメソッドとその型が印字される。もしname
が型構築子なら、その定義が印字される。もしname
が関数なら、その型が印字される。name
がソースファイルからロードされたものであった場合、GHCiはその定義のソースコード中の位置も表示する。
型およびクラスについては、それに言及するインスタンスもまとめて示す。無関係な情報を見せることがないように、インスタンスは、(a)その頭部がname
に言及している、かつ(b)そのインスタンスで言及されているものが全て:load
または:module
コマンドの結果としてスコープにある(修飾されていてもそうでなくても良い)、場合にのみ表示される。
:info!
コマンドも同様に動作するが、上記の制限(b)を外し、頭部がname
に言及するインスタンスでスコープにあるものを全て表示する。
:issafe
[module
]
与えられたモジュール(省略された場合は現在のモジュール)についてのSafe Haskell情報を表示する。これには、モジュールおよびそのパッケージの信用型を含む。
:kind
[!
] type
type
の種を推論し、印字する。type
は任意の型式で、Either Int
のような型構築子の部分適用であっても構わない。実際、:kind
は、(通常許されない)型シノニムの部分適用を書くことも認めるので、以下が動作する。
ghci> type T a b = (a,b,a) ghci> :k T Int Bool T Int Bool :: * ghci> :k T T :: * -> * -> * ghci> :k T Int T Int :: * -> *
省略可能な"!
"を指定した場合、GHCはさらに、型シノニムを展開して型関数の適用を評価することによって型を正規化し、その結果を表示する。
:list
identifier
identifier
の定義の周りか、与えられなかった場合には現在のブレークポイントの周りのソースコードを表示する。この識別子は解釈実行されているモジュールで定義されている必要がある。もし出力装置が対応しているなら、GHCiは注目している部分式を太字で強調する。
:list
[module
] line
module
の与えられた行数の周りのソースコードを表示する。このモジュールは解釈実行されている必要がある。もし出力装置が対応しているなら、GHCiは注目している部分式を太字で強調する。
:load
[*
]module
...
指定されたmodule
とそれが依存するモジュールすべてを再帰的にロードする。ここで、個々のmodule
はモジュール名またはファイル名でなければならない。また、パッケージ中のモジュールの名前であってはいけない。
以前にロードされていたモジュールは、パッケージ中のものを除いて、忘れ去られる。この新しいモジュールの集合をターゲット集合と呼ぶ。:load
を引数なしで使うと、ロードされているモジュールや束縛を全て未ロードにできることに注意。
通常、可能ならそのモジュールのコンパイル済みコードがロードされ、そうでなければそのモジュールはバイトコードにコンパイルされる。接頭辞*
を使うことでモジュールがバイトコードとしてロードされることを強制できる。
:load
コマンドの後、以下のものが文脈として設定される。
module
が成功裡にロードされたなら、module
。
そうでないとき、今回の:load
でロードされたモジュールがあるなら、最後に成功裡にロードされたモジュール。
そうでなければ、Prelude
。
:main arg1
... argn
プログラムがコンパイルされ実行されるとき、コマンド行引数にアクセスするためにgetArgs
関数を使うことができる。しかし、ghciでテストをしているときは、これらの引数を単純にmain
関数の引数として渡すことはできない。main
関数は直接には引数をとらないからである。
その代わり、:main
コマンドを使うことができる。これは、とにかくスコープにあるmain
を、引数がコマンド行から渡されたのと同じようにして実行する。例えば、次のようにである。
Prelude> let main = System.Environment.getArgs >>= print Prelude> :main foo bar ["foo","bar"]
スペースなどの文字を含む引数は、引用符に入れることができ、Haskellの文字列と同じように扱われる。また、Haskellのリスト構文をそのまま使うこともできる。
Prelude> :main foo "bar baz" ["foo","bar baz"] Prelude> :main ["foo", "bar baz"] ["foo","bar baz"]
最後に、-main-is
フラグや:run
コマンドを使えば、その他の関数を呼ぶことができる。
Prelude> let foo = putStrLn "foo" >> System.Environment.getArgs >>= print Prelude> let bar = putStrLn "bar" >> System.Environment.getArgs >>= print Prelude> :set -main-is foo Prelude> :main foo "bar baz" foo ["foo","bar baz"] Prelude> :run bar ["foo", "bar baz"] bar ["foo","bar baz"]
:module [+|-] [*]mod1
... [*]modn
,
import mod
プロンプトに入力される文のための文脈を設定または改変する。import
の形式はmod
:module +
と等価である。詳しくは2.4.5. プロンプトで実際にスコープにあるのは何かを見よ。mod
:print
names
...
評価を強制せずに値を表示する。:print
は、型が不明、または部分的にしか分かっていない値に対して使うことができる。ブレークポイントにおける、多相型を持った局所変数がこれに当たる。:print
は、実行時の値を調査しつつ、その値の型を再構築しようとし、可能ならGHCiの環境中でその型を精密にする。未評価の部分(サンク)に遭遇すると、:print
は、それぞれのサンクに対して、_t
で始まる名前の新しい変数を束縛する。さらなる情報は2.5.1. ブレークポイントと変数内容の表示を見よ。:sprint
コマンドも参照。これは:print
と同様だが、新しい変数を束縛しない。
:quit
GHCiを終了する。プロンプトでCtrl-Dを打つことでも終了できる。
:reload
現在のターゲット集合とそれらが依存するモジュールのうち、変更のあったものがあれば、ターゲット集合を再ロードしようと試みる。結果として、新しいモジュールがロードされたり、ターゲットから間接的に必要とされなくなったモジュールが外されたりするかもしれないことに注意せよ。
:run
:main
を見よ。
:script
[n
] filename
ファイルの各行をGHCiコマンドとして実行する。このコマンドは、:set +m
で設定される複数行モードと同時に使うことができる。
:set
[option
...]
色々なオプションを設定する。利用可能なオプションの一覧は2.8. :set
と:seti
コマンドを、GHCi固有のフラグは4.20.10. 対話モードのオプションを見よ。:set
コマンド単独では、どのオプションが現在有効になっているか表示する。また、現在の動的フラグの設定状況の一覧も表示する。GHCi固有のフラグは分けて表示される。
:set
args
arg
...
プログラムがSystem.getArgs
を呼んだときに返される引数のリストを設定する。
:set
editor
cmd
:edit
コマンドで使われるエディタをcmd
にする。
:set
prog
prog
プログラムがSystem.getProgName
を呼んだときに返される文字列を設定する。
:set
prompt
prompt
GHCiのプロンプトとして使われる文字列を設定する。prompt
の中では、%s
という並びは現在スコープにあるモジュールの名前に置き換えられ、%l
は現在のプロンプトの行番号(コンパイラメッセージで参照されるもの)に置き換えられ、%%
は%
に置き換えられる。prompt
が"で始まる場合、HaskellのStringとしてパースされる。そうでない場合はそのまま文字列として扱われる。
:set
prompt2
prompt
GHCiの継続プロンプト(:{
コマンドを使う際に使われる)として使われる文字列を設定する。
:set
stop
[num
] cmd
ブレークポイントに当たったとき、または履歴中で新しい項目が選択されたときに実行されるコマンドを設定する。:set :stop
の最も一般的な使われ方は、現在位置のソースコードを表示することである。例えば:set stop :list
のようにする。
コマンドの前に数値が与えられた場合、指定されたブレークポイント(だけ)に到達した場合に実行される。これは場合によって非常に便利である。例えば、:set stop 1 :continue
とすると、ブレークポイント1に到達した場合必ず:continue
が実行されるので、実質的にこのブレークポイントを無効化している。(但し、ブレークポイントに到達した場合のメッセージは出力される)。さらには、:def
と:cmd
を巧妙に使って、:set stop
で条件付きブレークポイントを実装することができる。
*Main> :def cond \expr -> return (":cmd if (" ++ expr ++ ") then return \"\" else return \":continue\"") *Main> :set stop 0 :cond (x < 3)
同様の技法を使えば、指定した回数だけブレークポイントを無視することもできる。
:seti
[option
...]
:set
と似ているが、:seti
で設定されたオプションはプロンプトに入力された式とコマンドにのみ影響し、:load
でロードされたモジュールには影響しない(対照的に、:set
で設定されたオプションはあらゆるところで適用される)。2.8.3. 対話的評価についてのみのオプションを設定するを見よ。
引数を与えなかった場合、プロンプトに入力される式とコマンドに適用されるオプションの集合を表示する。
:show bindings
プロンプトで導入された束縛と、その型を表示する。
:show breaks
有効になっているブレークポイントの一覧を表示する。
:show context
ブレークポイントで停止している、継続中の評価の一覧を表示する。
:show imports
import
コマンドや:module
コマンドによって作られ現在効力を持っているインポートを表示する。
:show modules
現在ロードされているモジュールの一覧を表示する。
:show packages
現在有効なパッケージフラグと、現在ロードされているパッケージの一覧を表示する。
:show paths
現在の作業ディレクトリ(:cd
コマンドによって設定される)と、ソースファイルを探すディレクトリの一覧(-i
オプションによって設定される)を表示する。
:show language
ソースファイルに対して現在有効になっている言語フラグを表示する。
:showi language
プロンプトで入力される式に対して現在有効になっている言語フラグを表示する(:seti
も見よ)。
:show [args|prog|prompt|editor|stop]
指定された設定を表示する(:set
を見よ)。
:sprint
評価を強制せずに値を表示する。:sprint
は:print
に似ているが、違いは、未評価の部分項が新しい変数に束縛されず、単に「_」と表されることである。
:step
[expr
]
全てのブレークポイントを有効にして、式を単一ステップモードで評価開始する。このモードでは、簡約一回ごとに評価が停止し、局所変数を確認することができる。expr
が与えられなかった場合、最後のブレークポイントから評価を再開する。2.5.2. ステップ実行を見よ。
:steplocal
現在の最上位束縛の中にあるブレークポイントのみを有効にした状態で、最後のブレークポイントから評価を再開する。
:stepmodule
現在のモジュール内にあるブレークポイントのみを有効にした状態で、最後のブレークポイントから評価を再開する。
:trace [expr
]
与えられた式を評価(式を与えられなかった場合は直近のブレークポイントから再開)するが、後で:history
で観察できるように評価ステップのログを残す。2.5.5. 追跡と履歴を見よ。
:type
expression
expression
の型を推論し、印字する。多相型には明示的な全称量化が加えられる。推論に際して、単相性制限は適用されない。
:undef
name
利用者定義のコマンドname
を未定義にする。(上の:def
を見よ)
:unset
option
...
ある種のオプションを無効にする。利用可能なオプションの一覧は、2.8. :set
と:seti
コマンドを見よ。
:!
command
...
シェルのコマンドcommand
を実行する。