summaryrefslogtreecommitdiff
path: root/src/lem_interp/interp_lib.lem
blob: 4cda331658569869c0deab2cc3c78922e21c245a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
open import Interp
open import Interp_ast
import Maybe_extra
open import Num
open import List

let add (V_tuple [V_lit(L_num x); V_lit(L_num y)]) = V_lit(L_num (x+y)) ;;

let rec vec_concat (V_tuple args) = match args with
  | [V_vector 0 true l; V_vector 0 true l'] -> V_vector 0 true (l ++ l')
  | [V_lit l; x] -> vec_concat (V_tuple [litV_to_vec l; x])
  | [x; V_lit l] -> vec_concat (V_tuple [x; litV_to_vec l])
  end;;

let function_map = [
  ("add", add);
  ("add_infix", add);
  (":", vec_concat);
] ;;

let eval_external name v = (Maybe_extra.fromJust (List.lookup name function_map)) v ;;