Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://anggtwu.net/LEAN/luatree1.lean.html
--   http://anggtwu.net/LEAN/luatree1.lean
--          (find-angg "LEAN/luatree1.lean")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun e () (interactive) (find-angg "LEAN/luatree1.lean"))

-- Index:
-- «.zconcat»		(to "zconcat")
-- «.arith»		(to "arith")
-- «.arithToString»	(to "arithToString")
-- «.fileio»		(to "fileio")


-----------------------------
-- «zconcat»  (to ".zconcat")

def q  s :=     "\"" ++ s ++ "\""
def zq s := "[0]=\"" ++ s ++ "\""
def br s :=      "{" ++ s ++ "}"
def ac s :=     ", " ++ s

def myconcat0 := List.foldl String.append ""
def acs (ss : List String) : String := myconcat0 (List.map ac ss)
def zacs (head : String) (ss : List String) : String := br ((zq head) ++ (acs ss))
def zconcat := zacs

#check            List.map
#check            List.map ac
#check            List.map ac ["a", "b", "c"]
#eval             List.map ac ["a", "b", "c"]
#eval  myconcat0              ["a", "b", "c"]
#eval  myconcat0 (List.map ac ["a", "b", "c"])
#eval  acs                    ["a", "b", "c"]
#eval  zacs    "foo"          ["a", "b", "c"]
#eval  zconcat "foo"          ["a", "b", "c"]


-- «arith»  (to ".arith")
-- (find-leanmetadocrfile "main/01_intro.lean" "inductive Arith : Type")

inductive Arith : Type where
  | add : Arith → Arith → Arith -- e + f
  | mul : Arith → Arith → Arith -- e * f
  | nat : Nat → Arith           -- constant
  | var : String → Arith        -- variable

declare_syntax_cat arith
syntax num                        : arith -- nat for Arith.nat
syntax str                        : arith -- strings for Arith.var
syntax:50 arith:50 " + " arith:51 : arith -- Arith.add
syntax:60 arith:60 " * " arith:61 : arith -- Arith.mul
syntax " ( " arith " ) "          : arith -- bracketed expressions

syntax " ⟪ " arith " ⟫ " : term

macro_rules
  | `(⟪ $s:str ⟫)              => `(Arith.var $s)
  | `(⟪ $num:num ⟫)            => `(Arith.nat $num)
  | `(⟪ $x:arith + $y:arith ⟫) => `(Arith.add ⟪ $x ⟫ ⟪ $y ⟫)
  | `(⟪ $x:arith * $y:arith ⟫) => `(Arith.mul ⟪ $x ⟫ ⟪ $y ⟫)
  | `(⟪ ( $x ) ⟫)              => `( ⟪ $x ⟫ )

#check ⟪ "x" * "y" ⟫
#check ⟪ "x" + "y" ⟫
#check ⟪ "x" + 20 ⟫
#check ⟪ "x" + "y" * "z" ⟫ -- precedence
#check ⟪ "x" * "y" + "z" ⟫ -- precedence
#check ⟪ ("x" + "y") * "z" ⟫ -- brackets



-- «arithToString»  (to ".arithToString")

section
open Arith
def  arithToString (o : Arith) : String := match o with
  | nat n => q (toString n)
  | var s => q s
  | mul a b => zconcat "*" [arithToString a, arithToString b]
  | add a b => zconcat "+" [arithToString a, arithToString b]
end

#eval arithToString ⟪ ("x" + "y") * 42 ⟫

def   tree1.lua := arithToString ⟪ ("x" + "y") * 42 ⟫
#eval tree1.lua



-- «fileio»  (to ".fileio")
-- (find-angg "LEAN/feline1.lean")

def mkfilepath (fname : String) : System.FilePath :=
  System.mkFilePath [fname]

def readfile   (fname : String) : IO String :=
  IO.FS.readFile (mkfilepath fname)

def writefile  (fname content : String) : IO Unit :=
  IO.FS.writeFile (mkfilepath fname) content

#eval writefile "/tmp/o1.lua" tree1.lua

def luatreescript  := "/home/edrx/luatree/luatree.lua"
def luatreetmpfile := "/tmp/o1.lua"

-- (find-sh "~/luatree/luatree.lua /tmp/o1.lua")

def luatreerun : IO String := do
  let out ← IO.Process.output { cmd := luatreescript, args := #[luatreetmpfile] }
  return out.stdout

#eval luatreerun
#eval do IO.println (← luatreerun)



-- Local Variables:
-- coding:  utf-8-unix
-- End: