This is a homework for functional programming course.
License: LGPL for implementation code + WTFPL for test examles in miniLanguage
Author: Vasy Pupkin, [email protected]
Features done (append only):
- Parser (for example)
- interpreter of non-recursive functions (for example)
- ...
Features in progress (and TODOs):
- Interpreter of recursive functions is not yet ready (for example)
- TODO: make pretty-printing less memory consuming (for example)
- ...
-
Если merge request не проходит CI -- проверяться не будет
-
Замечания должны быть откомментированы, иначе проверяться не будет.
- Если исправлены, должны быть поменчены как "исправлены"
- Если непонятны/некорректны, то это должно быть откомментировано соответствующим образом.
Такие суровые ограничения вводятся, чтобы замечания не игнорировались.
-
Иимена типов и функций -- snake_case
-
Имена типов модулей и модулей -- CamelCase
-
Ворнинги должны быть пофикшены
-
Не стесняйтесь писать
if ... then ... else
вместоmatch ... with true -> .. | false -> ...
-
Не стесняйтесь писать гварды в мэтчинге, например
match ... with
| x when f x -> ...
| x -> ...
| ...
вместо
match ... with
| x -> if f x then ... else ...
| ...
- Вместо
fun x y -> match y with
лучше писать короче:fun x -> function
- Используйте quoted string literals в тестах, чтобы не экранировать руками
─( 11:21:01 )─< command 1 >────────────────────────────
utop # {|
int main () {
return 0;
}
|};;
- : string = "\n int main () {\n return 0;\n }\n "
- Не надо писать
match ... with
| x ->
Hashtbl.replace tbl key value |> fun () -> ...
Лучше
match ... with
| x ->
let () = Hashtbl.replace tbl key value in
...
или
match ... with
| x -> (
Hashtbl.replace tbl key value;
...
)
или даже
match ... with
| x -> begin
Hashtbl.replace tbl key value;
...
end
- Не надо писать
let x = if long_expression then true else false in ...
лучше
let x = long_expression in ...
- 1