Загрузка типов в ocaml из другого файла - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь использовать типы, которые у меня есть в другом файле (tokenTypes.ml):

type token =
| OpenBrace
| CloseBrace
| OpenParen
| CloseParen
| Semicolon
| IntKeyword
| ReturnKeyword
| Negation
| BitwiseComp
| LogicNegation
| Int of int
| Id of string

И я пытаюсь использовать его в другом файле (лексере), первый случай сработалотлично:

let token_to_string t =
match t with
| OpenBrace -> "{ "
| CloseBrace -> "} "
| OpenParen -> "( "
| CloseParen -> ") "
| Semicolon -> "; "
| IntKeyword -> "INT "
| ReturnKeyword -> "RETURN "
| Negation -> "-"
| BitwiseComp -> "~"
| LogicNegation -> "!"
| Int i -> Printf.sprintf "INT<%d> " i
| Id id -> Printf.sprintf "ID<%s> " id

Я могу использовать каждый определенный тип токена, но затем, когда я пытаюсь создать новый экземпляр токена типа, компилятор говорит:

КонструкторОтрицание не относится к типу TokenTypes.token

, поэтому мне нужно создать модуль с помощью ocamlopt -c tokenTypes.ml, а затем использовать его в коде с открытым кодом, например:

lex_rest char_list = 
let open TokenTypes in
match char_list with
    | [] -> []
    | '{'::rest -> OpenBrace::(lex_rest rest)
    | '}'::rest -> CloseBrace::(lex_rest rest)
    | '('::rest -> OpenParen::(lex_rest rest)
    | ')'::rest -> CloseParen::(lex_rest rest)
    | ';'::rest -> Semicolon::(lex_rest rest)
    | '-'::rest -> Negation::(lex_rest rest)
    | '~'::rest -> BitwiseComp::(lex_rest rest)
    | '!'::rest -> LogicNegation::(lex_rest rest)

есть ли способ не использовать модуль?Я хочу выйти из открытой части и использовать только исходный код, а не модуль.

Help pls: c

1 Ответ

0 голосов
/ 14 декабря 2018

У верхнего уровня (и утопа) OCaml есть возможность для включения файла:

$ cat m.ml
type abc = A | B | C
$ ocaml
        OCaml version 4.06.1

# #use "m.ml";;
type abc = A | B | C
# let x = A;;
val x : abc = A
#

Однако, это только особенность верхнего уровня и утопа.Это не особенность языка OCaml:

$ cat c.ml
#use "m.ml"

let x = A
$
$ ocamlopt -c c.ml
File "c.ml", line 1, characters 0-1:
Error: Syntax error

Вам нужно использовать модуль, чтобы делать то, что вы хотите.Модули действительно хороши, когда к ним привыкаешь: -)

...