| 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のコードを試すことが可能となります。