git @ Cat's Eye Technologies Decoy / master src / test_decoy.lua
master

Tree @master (Download .tar.gz)

test_decoy.lua @masterraw · history · blame

-- SPDX-FileCopyrightText: Copyright (c) 2023-2024 Chris Pressey, Cat's Eye Technologies.
-- This work is distributed under a 2-clause BSD license. For more information, see:
-- SPDX-License-Identifier: LicenseRef-BSD-2-Clause-X-Decoy

-- Usage:
--   LUA_PATH="?.lua" lua test_decoy.lua

table = require "table"

require "decoy.model"

-- Cons cells

local c = Cons.new(Symbol.new("meow"), Cons.new(Symbol.new("woof"), Nil))

print(type(c))
print(depict(c:head()))
print(depict(c:tail()))

-- Parser

local Parser = require "decoy.parser"

local p, j, sexp

p = Parser.new("(meow woof)")
sexp = p:parse_sexp()
print(depict(sexp))

p = Parser.new("(a ())")
sexp = p:parse_sexp()
print(depict(sexp))
print(render(sexp))
print(Cons.table_to_list({}))

p = Parser.new([[
  ; Not actually Scheme, just a Scheme-like language

  (define new-map (lambda ()
    (quote ())
  ))
  
  (define set (lambda (key val map)
    (cons (cons key val) map)
  ))
  
  (define get (lambda (key map)
    (cond
      ((null? map) (error "No such key"))
      ((equal? (car (car map)) key) (cdr (car map)))
      (else (get key (cdr map))))
  ))
  
  (define update (lambda (key fn map)
    (set key (fn (get key map)) map)))
]])
local result = p:parse_sexps()
for j, expr in ipairs(result) do
    print(depict(expr))
end

local Evaluator = require "decoy.eval"
local Desugarer = require "decoy.desugar"

local make_stdenv = dofile "../lib/lua/stdenv.lua"

function run(s)
  local p = Parser.new(s)
  local expr = p:parse_sexp()
  print("???", depict(expr))
  local desugarer = Desugarer.new()
  expr = desugarer:desugar_expr(expr)
  print("==>", depict(expr))
  local evaluator = Evaluator.new()
  local r = evaluator:eval_expr(expr, make_stdenv().symbols)
  print("=", depict(r))
end

run("\"meow\"")
run("(+ 1 0)")
run("(let* ((a 1)) a)")
run("(let* ((a 1) (b 2)) (+ a b))")