@ -5,7 +5,10 @@ open Box
let named_ptr name = box ~ name ( tex " " )
(* a named box intended to be used as a block metadata which implies filled with black *)
let named_meta name = box ~ name ~ fill : Color . lightred ( tex " " )
let named_meta name = box ~ name ~ fill : Color . lightred ( tex " " )
(* a named scalar *)
let named_scalar ~ name v = box ~ name ( tex v )
(* a block of pointers, all elements are named, the first one is a metadata box all others are ptr boxes *)
let ptr_block name names =
@ -14,8 +17,15 @@ let ptr_block name names =
(* a block of scalars, only the metadata is named, all other have content ( the scalar value ) *)
let scalar_block name values = hblock @@ ( named_meta name :: List . map tex values )
(* a stack ptr entry, s is the variable name and the pointer box will also be named after it *)
let stack_ptr s = hbox [ tex ( Format . sprintf " \\ texttt{%s}: " s ) ; named_ptr s ]
let scalar_array name values = hblock ~ name ( List . map tex values )
(* a stack ptr entry, name is the variable name and the pointer box will also be named after it *)
let stack_ptr name =
hbox [ tex ( Format . sprintf " \\ texttt{%s}: " name ) ; named_ptr name ]
(* a stack scalar entry, s is the variable name and the pointer box will also be named after it *)
let stack_scalar ~ name v =
hbox [ tex ( Format . sprintf " \\ texttt{%s}: " name ) ; named_scalar ~ name v ]
(* a stack made of stack entries *)
let stack l = vbox ~ padding : ( Num . em 2 . ) [ tex " stack: " ; vbox l ]
@ -65,7 +75,83 @@ let figure_python_layout =
; ptr " x " " 42_meta "
]
let figure_ocaml_layout =
let stack =
stack
[ stack_ptr " array1 "
; stack_ptr " array2 "
; stack_ptr " pair "
; stack_scalar ~ name : " x " " 42 "
]
in
let heap =
vbox ~ padding : ( Num . em 2 . )
[ tex " heap: "
; scalar_block " array1_meta " [ " 1 " ; " 2 " ; " 3 " ]
; ptr_block " pair_meta " [ " pair_1 " ; " pair_2 " ]
; scalar_block " array2_meta " [ " 42 " ; " 99 " ; " 666 " ]
]
in
let figure = hbox ~ padding : ( Num . em 2 . ) [ stack ; heap ] in
let ptr a b = Helpers . box_pointer_arrow ( get a figure ) ( get b figure ) in
Command . seq
[ draw figure
; ptr " array1 " " array1_meta "
; ptr " array2 " " array2_meta "
; ptr " pair " " pair_meta "
; ptr " pair_1 " " array1_meta "
; ptr " pair_2 " " array2_meta "
]
let figure_java_layout =
let stack =
stack
[ stack_ptr " array1 "
; stack_ptr " array2 "
; stack_ptr " pair "
; stack_scalar ~ name : " x " " 42 "
]
in
let heap =
vbox ~ padding : ( Num . em 2 . )
[ tex " heap: "
; scalar_array " array1_array " [ " 1 " ; " 2 " ; " 3 " ]
; hbox ~ padding : ( Num . em 1 . )
[ scalar_block " 1_meta " [ " 1 " ]
; scalar_block " 2_meta " [ " 2 " ]
; scalar_block " 3_meta " [ " 3 " ]
]
; ptr_block " array1_meta " [ " array1_1 " ; " array1_2 " ; " array1_3 " ]
; ptr_block " pair_meta " [ " pair_1 " ; " pair_2 " ]
; ptr_block " array2_meta " [ " array2_1 " ; " array2_2 " ; " array2_3 " ]
; hbox ~ padding : ( Num . em 1 . )
[ scalar_block " 42_meta " [ " 42 " ]
; scalar_block " 99_meta " [ " 99 " ]
; scalar_block " 666_meta " [ " 666 " ]
]
]
in
let figure = hbox ~ padding : ( Num . em 2 . ) [ stack ; heap ] in
let ptr a b = Helpers . box_pointer_arrow ( get a figure ) ( get b figure ) in
Command . seq
[ draw figure
; ptr " array1 " " array1_array "
; ptr " array1_1 " " 1_meta "
; ptr " array1_2 " " 2_meta "
; ptr " array1_3 " " 3_meta "
; ptr " array2 " " array2_meta "
; ptr " array2_1 " " 42_meta "
; ptr " array2_2 " " 99_meta "
; ptr " array2_3 " " 666_meta "
; ptr " pair " " pair_meta "
; ptr " pair_1 " " array1_meta "
; ptr " pair_2 " " array2_meta "
]
let () =
Array . iter
( fun ( name , figure ) -> Metapost . emit name ( Picture . scale ( Num . em 1 . ) figure ) )
[| ( " figure_python_layout " , figure_python_layout ) |]
[| ( " figure_python_layout " , figure_python_layout )
; ( " figure_ocaml_layout " , figure_ocaml_layout )
; ( " figure_java_layout " , figure_java_layout )
|]