Skip to content

Commit

Permalink
Use Finger Tree and Integer Maps as data structures for L0
Browse files Browse the repository at this point in the history
  • Loading branch information
EduardoLR10 committed Oct 16, 2024
1 parent ceb4340 commit 196b144
Show file tree
Hide file tree
Showing 9 changed files with 32 additions and 52 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@
_build
*.opam
result
*.cmi
*.cmo
2 changes: 1 addition & 1 deletion bin/dune
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@
(executable
(name main)
(public_name karuta)
(libraries ast)
(libraries lib)
(package karuta))
2 changes: 1 addition & 1 deletion bin/main.ml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
let () = Ast.say_hi ()
let () = Lib.Ast.say_hi ()
2 changes: 1 addition & 1 deletion dune-project
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@
(package
(name karuta)
(synopsis "A compiler for a statically-typed relational programming language")
(depends ocaml dune menhir batteries)
(depends ocaml dune menhir (batteries (>= 3.8.0)))
(tags
(prolog logic compiler relational warren)))
26 changes: 2 additions & 24 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@
src = sources.ocaml;

buildInputs = [
ocamlPackages.menhir
ocamlPackages.batteries
# Ocaml package dependencies needed to build go here.
];

Expand Down Expand Up @@ -143,27 +145,6 @@
touch $out
'';

# Check documentation generation
dune-doc = legacyPackages.runCommand "check-dune-doc"
{
ODOC_WARN_ERROR = "true";
nativeBuildInputs = [
ocamlPackages.dune_3
ocamlPackages.ocaml
ocamlPackages.odoc
];
}
''
echo "checking ocaml documentation"
dune build \
--display=short \
--no-print-directory \
--root="${sources.ocaml}" \
--build-dir="$(pwd)/_build" \
@doc
touch $out
'';

# Check Nix formatting
nixpkgs-fmt = legacyPackages.runCommand "check-nixpkgs-fmt"
{ nativeBuildInputs = [ legacyPackages.nixpkgs-fmt ]; }
Expand Down Expand Up @@ -202,9 +183,6 @@
ocamlPackages.ocamlformat-rpc-lib
# Fancy REPL thing
ocamlPackages.utop
# Libraries
ocamlPackages.menhir
ocamlPackages.batteries
];

# Tools from packages
Expand Down
4 changes: 3 additions & 1 deletion lib/dune
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
; - https://dune.readthedocs.io/en/stable/dune-files.html#library

(library
(name ast)
(name lib)
(modules ast evaluator)
(libraries batteries)
(package karuta))

(documentation
Expand Down
40 changes: 19 additions & 21 deletions lib/evaluator.ml
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,18 @@ let question (_program : Ast.t) (_query : Ast.t) : Ast.t Map.t list =
failwith "Not Implemented"

module Heap = struct
type 'a t = 'a Seq.t
module FT = BatFingerTree

let push (heap : 'a t) (data : 'a) = Seq.cons data heap
let pop (heap : 'a t) = if Seq.is_empty heap then heap else Seq.drop 1 heap
type 'a t = 'a FT.t

let top (heap : 'a t) =
Option.map (function value, _ -> value) @@ Seq.uncons heap
let push = FT.snoc
let pop = FT.init
let top = FT.last

let put (elem : 'a) (index : int) (heap : 'a t) : 'a t =
failwith "Not implemented"
FT.set heap index elem

let empty = FT.empty
end

module AbstractMachine = struct
Expand All @@ -24,43 +26,39 @@ module AbstractMachine = struct
end

open Cell
module FT = BatFingerTree
module IM = BatIMap

type computer = {
heap : Cell.t Heap.t;
registers : Cell.t list;
registers : Cell.t IM.t;
h_register : int;
}

(* Creates a new structure on the heap *)
let put_structure (index_of_register : int) (functor_label, functor_arity)
{ heap; registers; h_register } =
let stru = Structure (h_register + 1) in
let structure = Structure (h_register + 1) in
let func = Functor (functor_label, functor_arity) in
let heap =
Heap.put func (h_register + 1) @@ Heap.put stru h_register heap
in
let registers =
List.mapi
(fun i elem -> if i = index_of_register then stru else elem)
registers
Heap.put func (h_register + 1) @@ Heap.put structure h_register heap
in
let registers = IM.add index_of_register structure registers in
let h_register = h_register + 2 in
{ heap; registers; h_register }

let set_variable (index_of_register : int) { heap; registers; h_register } =
let reference = Reference h_register in
let heap = Heap.put reference h_register heap in
let registers =
List.mapi
(fun i elem -> if i = index_of_register then reference else elem)
registers
in
let registers = IM.add index_of_register reference registers in
let h_register = h_register + 1 in
{ heap; registers; h_register }

let set_value (index_of_register : int) { heap; registers; h_register } =
let value_of_register = List.nth registers index_of_register in
let value_of_register = IM.find index_of_register registers in
let heap = Heap.put value_of_register h_register heap in
let h_register = h_register + 1 in
{ heap; registers; h_register }

let initialize () : computer =
{ heap = Heap.empty; registers = IM.empty ~eq:( = ); h_register = 0 }
end
4 changes: 2 additions & 2 deletions test/dune
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

(test
(name say_hi)
(package karuta)
(libraries ast))
(libraries lib)
(package karuta))

; More information on Cram tests can be found in the Dune documentation:
;
Expand Down
2 changes: 1 addition & 1 deletion test/say_hi.ml
Original file line number Diff line number Diff line change
@@ -1 +1 @@
let () = Ast.say_hi ()
let () = Lib.Ast.say_hi ()

0 comments on commit 196b144

Please sign in to comment.