2016-03-11 6 views
0

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

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 

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

ответ

3

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

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

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

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

вход не рассматривается как имя файла, но рассматривается как имя переменных местоположения. С пустым вводом 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" 

 Смежные вопросы

  • Нет связанных вопросов^_^