Как скомпилировать используя Camlp4?

Я проверяю цитаты в Camlp4. Моя программа tester.ml выглядит следующим образом:

open Camlp4.PreCast;;
let x = <:Cstm< x = 1 + 2 >>;;
let y = <:expr< let y = 1 + 2 >>;;
print_string "done";;

Я пытался компилировать это различными способами, например.

ocamlc -pp "camlp4of pa_extend.cmo -loc" -I +camlp4 tester.ml

однако полученный исполняемый файл не распечатывает "выполнено", как ожидалось. Как мне скомпилировать этот файл?

1 ответ

Решение

camlp4 --help говорит:

-loc <name>      Name of the location variable (default: _loc).

Вы забыли аргумент для -loc, Вы можете проверить последствия этого по ocamlc"s -verbose вариант. (-verbose действительно удобно узнать, что именно происходит в компиляции):

$ ocamlc -verbose -pp "camlp4of pa_extend.cmo -loc" -I +camlp4 tester.ml
+ camlp4of pa_extend.cmo -loc "tester.ml" > /blahblah//ocamlpp2f0635

Имя входного файла tester.ml не обрабатывается как имя файла, но рассматривается как имя переменных местоположения. С пустым вводом camlp4of выводит пустую программу и она компилируется ocamlc, Вот почему финальный исполняемый файл ничего не делает.

Ваш код содержит странное название цитаты Cstrm, а также let y = 1 + 2 это не выражение, а элемент структуры. Ниже приведен один из ближайших кодов, которые компилируются:

(* compilable by ocamlc -pp "camlp4of pa_extend.cmo" -I +camlp4 tester.ml *)
open Camlp4.PreCast;;
let x _loc = <:expr< x = 1 + 2 >>;;
let y _loc = <:str_item< let y = 1 + 2 >>;;
print_string "done";;

Вы можете проверить вывод CamlP4 в удобочитаемой форме с помощью -printer Camlp4OCamlPrinter вариант. Это еще один важный метод для работы с CamlP4:

$ camlp4of pa_extend.cmo -printer Camlp4OCamlPrinter tester.ml
open Camlp4.PreCast

let x _loc =
  Ast.ExApp (_loc,
    (Ast.ExApp (_loc, (Ast.ExId (_loc, (Ast.IdLid (_loc, "=")))),
       (Ast.ExId (_loc, (Ast.IdLid (_loc, "x")))))),
    (Ast.ExApp (_loc,
       (Ast.ExApp (_loc, (Ast.ExId (_loc, (Ast.IdLid (_loc, "+")))),
          (Ast.ExInt (_loc, "1")))),
       (Ast.ExInt (_loc, "2")))))

let y _loc =
  Ast.StVal (_loc, Ast.ReNil,
    (Ast.BiEq (_loc, (Ast.PaId (_loc, (Ast.IdLid (_loc, "y")))),
       (Ast.ExApp (_loc,
          (Ast.ExApp (_loc, (Ast.ExId (_loc, (Ast.IdLid (_loc, "+")))),
             (Ast.ExInt (_loc, "1")))),
          (Ast.ExInt (_loc, "2")))))))

let _ = print_string "done"
Другие вопросы по тегам