Skip to content

Commit f9911eb

Browse files
committed
Make Sakura files a unified module with global scoping
1 parent 4520316 commit f9911eb

7 files changed

Lines changed: 40 additions & 12 deletions

File tree

bin/main.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ let run : cmd -> unit = function
2626
| Compile { files; run; log_level } ->
2727
Logger.Level.set_min_level log_level;
2828
check_extensions (BatSet.String.of_list [ ".krt"; ".skr"; ".pl" ]) files;
29+
(* TODO: Make sakura module name as an available CLI option with db being the default *)
30+
let cli : Compiler.Types.cli = { sakura_module_name = "db" } in
2931
let* _ =
30-
Executor.compile
32+
Executor.compile cli
3133
(fun name forms ->
3234
Erl.compile "runtime" name @@ BatFingerTree.to_list forms)
3335
files

lib/Error.ml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ let error = error
2424
let ( ||> ) = bind
2525
let map = Result.map
2626

27+
let fold (f : 'b list -> 'a -> 'b list attempt) (elements : 'a list) :
28+
'b list attempt =
29+
List.fold_left
30+
(fun acc element -> Result.bind acc (Fun.flip f element))
31+
(ok []) elements
32+
2733
let ( let* ) o f =
2834
match o with
2935
| Error err ->

lib/Executor.ml

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,29 @@ end
3838
module Sakura = struct
3939
let compile_clause = Sakura.compile_clause
4040

41-
module Lookup = Compiler.Lookup
41+
module Lookup = Database.Lookup
4242
end
4343

4444
type preprocessed_files = Ast.Clause.t BatFingerTree.t BatMap.String.t
4545
type preprocessed_result = Preprocessor.DependencyGraph.t * preprocessed_files
4646

4747
(* FIXME: hook up dependency information and sort the file list before compiling *)
4848
(* TODO: compilation cache *)
49-
let compile (persist : Compiler.Types.Persist.t) (filepaths : string list) :
49+
let compile ({ sakura_module_name } : Compiler.Types.cli)
50+
(persist : Compiler.Types.Persist.t) (filepaths : string list) :
5051
unit attempt =
52+
let is_sakura_file filepath = Filename.extension filepath = ".skr" in
53+
let sakura_filename = sakura_module_name ^ ".skr" in
54+
let sakura_files, karuta_files = BatList.partition is_sakura_file filepaths in
55+
let* sakura_output =
56+
sakura_files
57+
|> Error.fold (fun parsed filepath ->
58+
parse filepath |> Error.map (List.append parsed))
59+
||> preprocess (Preprocessor.initialize sakura_filename)
60+
in
5161
let compile_one_file (preprocessed : preprocessed_files) filepath externals =
52-
let extension = Filename.extension filepath in
5362
let compiler_config =
54-
if extension = ".skr" then
63+
if is_sakura_file filepath then
5564
(module Sakura : Compiler.Types.COMPILER_CONFIG)
5665
else (module Karuta : Compiler.Types.COMPILER_CONFIG)
5766
in
@@ -78,18 +87,20 @@ let compile (persist : Compiler.Types.Persist.t) (filepaths : string list) :
7887
in
7988
let* dependency_graph, preprocessed_files =
8089
List.fold_left preprocess_one
81-
(ok (Preprocessor.DependencyGraph.empty, BatMap.String.empty))
90+
(ok
91+
( sakura_output.dependencies,
92+
BatMap.String.singleton sakura_filename sakura_output.clauses ))
8293
filepaths
8394
in
8495
let* expanded_graph = Preprocessor.DependencyGraph.expand dependency_graph in
8596
let sorted_file_paths =
86-
Preprocessor.DependencyGraph.sort expanded_graph filepaths
97+
Preprocessor.DependencyGraph.sort expanded_graph karuta_files
8798
in
8899
let rec compile_all imports = function
89100
| [] -> Ok ()
90101
| f :: files ->
91-
Result.bind (compile_one_file preprocessed_files f imports)
92-
(fun result -> compile_all result.externals files)
102+
let* result = compile_one_file preprocessed_files f imports in
103+
compile_all result.externals files
93104
in
94105
compile_all BatMap.String.empty sorted_file_paths
95106

lib/Parser.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,7 @@ and top_level : 'e. (Ast.ParserClause.t list, ([> expr_errors ] as 'e)) parser =
456456
@@ fun result -> skip_whitespace_and_comments @&& return result)
457457
@> replace @@ BatFingerTree.to_list
458458

459+
(* TODO: Change output type of this to be a fingertree *)
459460
let parse (filepath : string) (source : string) =
460461
match
461462
{

lib/compiler/Lookup.ml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
open Types
1+
include Types
22

3-
type t = Types.t
43
type 'a nested_env = 'a env BatLazyList.t
54
type scope = comptime nested_env
65
type sig_scope = signature nested_env
@@ -61,7 +60,7 @@ let empty_signature : sig_scope = BatLazyList.nil
6160
let sig_env_to_sig_scope (env : signature env) : sig_scope =
6261
BatLazyList.of_list [ env ]
6362

64-
let sig_cons (scope : sig_scope) (env : Types.sig_env) : sig_scope =
63+
let sig_cons (scope : sig_scope) (env : sig_env) : sig_scope =
6564
BatLazyList.cons env scope
6665

6766
let ancestors_of_compiler (compiler : t) : scope =

lib/compiler/Types.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ module type LookupS = sig
8989
| `UnexpectedSignature of Location.location ]
9090
end
9191

92+
type cli = { sakura_module_name : string }
93+
9294
type t = {
9395
externals : comptime env;
9496
imports : BatSet.String.t;

lib/database/Lookup.ml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
include Compiler.Lookup
2+
3+
let ancestors_of_compiler (compiler : t) : scope =
4+
let open BatLazyList in
5+
unfold (Some compiler) (function
6+
| None -> None
7+
| Some { parent; env; _ } -> Some (env.modules, parent))

0 commit comments

Comments
 (0)