Edit this page | Report an issue |
opam switch 4.03.0
を実行しようとするとエラーになります.
opam switch create 4.07.1
をすると opam: Invalid switch subcommand "create"
といったエラーが表示されます.
opam switch create 4.07.1
の代わりに opam switch set 4.07.1
を使ってみてください.バージョン 4.07.1 が利用可能でない場合、opam switch list
を実行して利用可能なバージョン一覧を確認し、その中で最新のものを指定してください.opam
の設定が有効になりません.
bash
シェルを使っている場合,シェルの環境設定ファイルはopam init
がデフォルトで想定している~/.bash_profile
ではなく~/.profile
です.たとえば:
$ opam init
...(中略)...
Do you want OPAM to modify ~/.bash_profile and ~/.ocamlinit?
(default is 'no', use 'f' to name a file other than ~/.bash_profile)
[N/y/f] f
Enter the name of the file to update: ~/.profile
のようにopam init
コマンドを実行している途中で入力し,opam init
が~/.profile
に設定を加えるように指定してください.
Q1-4. Emacs の中でrun-ocaml
が使えない.
A1-4. Emacs の設定ファイル中に:
(with-eval-after-load
(setq tuareg-interactive-program "~/.opam/opam config exec -- ocaml"))
と書いてください.Emacs の設定ファイルがどこにあるかは人によって異なりますが,~/.emacs
,~/.emacs.d/init.el
などが一般的です.
Q1-5. opam の各種コマンンドを実行するとスタックオーバーフローで落ちる.
A1-5. opam サービス側の問題のようです.とりあえず,自分のシェルの設定ファイル(~/.bash_profile
,~/.profile
等)の末尾に:
CAML_LD_LIBRARY_PATH="/export/home/lab4/k.yasugi/.opam/4.03.0/lib/stublibs"
export CAML_LD_LIBRARY_PATH
PERL5LIB="/export/home/lab4/k.yasugi/.opam/4.03.0/lib/perl5"
export PERL5LIB
OCAML_TOPLEVEL_PATH="/export/home/lab4/k.yasugi/.opam/4.03.0/lib/toplevel"
export OCAML_TOPLEVEL_PATH
PATH="/export/home/lab4/k.yasugi/.opam/4.03.0/bin:$PATH"
export PATH
を追加し,ログインしなおすと課題 2 や課題 3 のmake
は出来るようになるはずです.
(ただし,opam install
,opam update
,opam upgrade
などの opam 環境を更新するよう
なコマンドは一切使えません.定期的に上の設定をコメントアウトして,元の(自分の)opam
コマンド
がまた使えるようになってないか確認し,使えるようになってたら,ここで説明した回避策の使用は控えてください.
dune runtest
をしようとすると dune
が無いと怒られる.
eval `opam config env`
を実行して試してみてください. (backquote です.タイプミスに注意してください.)
また,このコマンドは opam switch
することで表示されるはずです.
Q2-2. Exercise 3.8 の powi
は,問題には引数が増えると書いてありますが,main.mli
をみると増えていません.
A2-2. 基本的には,powi
のインターフェースはmain.mli
に沿い,powi
の定義の中で引数を増やした関数を作成してください.つまり,
let powi (x, n) =
let rec f (x, n) s = ... in
f (x, n) 1
としてください.もしくは,main.mli
とtest/ex3_8.ml
を編集してインターフェースを変更しても良いです(その場合はその旨をコメントに書いてください).
Q2-3. Exercise 5.6 で,main.mli
にはquick
とquicker
の 2 つがあるのですが,quick
には何を書けばいいですか?テキストを写せば良いですか?
quick
にはテキストのものではなく,@
を使わずに書き換えたものを定義してください.もっと言えば,quick
はquicker
を使って定義することを想定しています.Q2-4. Exercise 6.1 の座標は具体的に図形のどの座標を指していますか?
Q3-1. dune build
は通るのに、dune runtest
が通りません.次のようなエラーが表示されます.
File "test/evalTestGenerator.ml", line 38, characters 30-31:
Error: Syntax error: operator expected.
A3-1. ocaml のバージョンが古いためだと考えられます.次のコマンドでバージョンを切り替えてください.
opam switch create 4.07.1
opam switch 4.07.1
opam switch create
が使えない場合、代わりに opam switch set
を使ってください.
バージョン 4.07.1 が利用可能でない場合は、opam switch list
コマンドにより利用可能なバージョン一覧を表示し、最新のものを指定してください.
その後、次のコマンドによりパッケージのインストールなどを行ってください.
opam install ounit dune menhir merlin
eval $(opam env)
Q3-2. Exercise 3.2.3 の論理演算子(&&
,||
)を正しく実装したはずなのに,自動テストを通りません.
&&
,||
の正確な定義を誤解している可能性があります.『Objective Caml 入門 』2.2.6 節の説明をもう一度よく読みなおしてみてください.Q3-3. Exercise 3.2.3 の論理演算子(&&
,||
)を実装する課題のテストケースにfalse && undef
というのがあり、これはOCamlのインタプリタではエラーになりますが、テストではfalse
が正解となっています。これはどういうことですか?
Q3-4. Exercise 3.3.2を実装する為にeval_decl
の型を変更するとテストがコンパイルできなくなります.
exec.ml
辺りを書き換えると良いでしょう.Q4-1. Exercise 4.3.1 のテストを走らせようとすると
Error: This expression has type string but an expression was expected of type (string * string) list
と怒られる.
A4-1. test/ex4_3_1.ml
ファイルの 21 行目を
let (dataset_for_freevar_ty: freevar_ty_testcase list) = [
に変更してみてください.
Q4-2. Exercise 4.4.1 のテストを走らせようとすると
File "test/typingTestGenerator.ml", line 83, characters 10-12:
Error: This expression has type ty * tysc Environment.t
but an expression was expected of type ty
と怒られる.
A4-2. test/typingTestGenerator.ml
の 75 行目を
let env, ty = ty_decl env program in
に変更してみてください.
新しいFAQの項目を次のように追加できます。
A5-1. はい、あります。以下の手順に従って設定を行うことで、対話環境で MiniML をテストできます。
utop
という高機能な OCaml の REPL を opam install utop
でインストールします。dune utop
を実行します。すると、MiniML のモジュールがロードされた状態で utop
の REPL が実行されます。open Miniml
と入力します。➜ isle3sw--2021-interpreter-ksuenaga git:(master) ✗ dune utop
────────┬─────────────────────────────────────────────────────────────┬─────────
│ Welcome to utop version 2.6.0 (using OCaml version 4.10.0)! │
└─────────────────────────────────────────────────────────────┘
Findlib has been successfully loaded. Additional directives:
#require "package";; to load a package
#list;; to list the available packages
#camlp4o;; to load camlp4 (standard syntax)
#camlp4r;; to load camlp4 (revised syntax)
#predicates "p,q,...";; to set these predicates
Topfind.reset();; to force that packages will be reloaded
#thread;; to enable threads
Type #utop_help for help about using utop.
─( 22:18:27 )─< command 0 >──────────────────────────────────────{ counter: 0 }─
utop # open Miniml;;
─( 22:18:27 )─< command 1 >──────────────────────────────────────{ counter: 0 }─
utop # Environment.extend;;
- : string -> 'a -> 'a Environment.t -> 'a Environment.t = <fun>
─( 22:18:31 )─< command 2 >──────────────────────────────────────{ counter: 0 }─
utop #
➜ isle3sw--2021-interpreter-ksuenaga git:(master) ✗
これにより、対話的にMiniMLのコードを試すことが可能となります。