zuramaru

[WIP] An experience of Make-A-Lisp ずら〜


Keywords
library, mit, program, simple, Propose Tags , haskell, lisp, lisp-interpreter, lisp-processor
License
MIT
Install
cabal install zuramaru-0.1.0.0

Documentation

((((zuramaru)))) Build Status

'おらは 国木田花丸 ずら〜'

❗️ As an inline-lisp in Haskell ❗️

QuasiQuoters are supported in a module Maru.QQ.ShortName (Maru.QQ)

💪 Example 💪

1️⃣ S expression parser

As expressions

>>> print [parse|123|]
AtomInt 123

>>> print [parse|sugar|]
AtomSymbol "sugar"

>>> print [parse|(1 2 3)|]
Cons (AtomInt 1) (Cons (AtomInt 2) (Cons (AtomInt 3) Nil))

As patterns

>>> case AtomInt 123 of; [parse|123|] -> "good"
"good"

>>> case AtomInt 000 of; [parse|123|] -> "bad"; AtomInt _ -> "good"
"good"

>>> case Cons (AtomSymbol "x") (Cons (AtomInt 10) Nil) of; [parse|(x 10)|] -> "good"
"good"

As types (compile time calculations)

>>> fromSing (sing :: Sing [parse|10|])
AtomInt 10

>>> fromSing (sing :: Sing [parse|konoko|])
AtomSymbol "konoko"

>>> fromSing (sing :: Sing [parse|(1 2 3)|])
Cons (AtomInt 1) (Cons (AtomInt 2) (Cons (AtomInt 3) Nil))

2️⃣ S expression parser + preprocessor

>>> [parsePreprocess|sugar|]
AtomSymbol "sugar"

>>> [parsePreprocess|'10|]
Quote (AtomInt 10)

>>> [parsePreprocess|(quote 10)|]
Quote (AtomInt 10)

3️⃣ 🎉 S expression parser + preprocessor + evaluator

>>> [zurae|10|]
10

>>> [zurae|(print 10)|]
10Nil

>>> [zurae|'10|]
AtomInt 10

>>> [zurae|sugar|]
<interactive>:12:8: error:
     Maru.QQ.zurae: an error is occured in the compile time: EvalException: "A symbol 'sugar' is not found"
     In the quasi-quotation: [zurae|sugar|]

The halting safety is abandon by turing-completement 😆


Please see below modules's doctests for more infomation