简单的介绍一下 Lime 的工作原理
Lime 是一种简单的,基于 S-表达式的程序设计语言
Lime 拥有这几种原生类型
布尔:
数字:默认 Double,支持 BigInteger 或 BigDecimal、Float、Long、Byte、Integer、Short 手动解析时根据词条类型转换
字符串:Java 的
标识符(符号):Symbol 对象
S 表达式:SexpList 对象
宏:Macro 对象
详细信息可以看 KtLime 取用
Lime 是一门基于宏的语言,所有「函数调用」最终会被展开为「内部展开器」调用
宏可以被「apply」,apply(施用)的结果「application」可能是这样的:
最终所有宏都会被递归展开为 「内部展开器调用」形式
这就是 Lime 的工作原理
Lime 是一种简单的,基于 S-表达式的程序设计语言
Lime 拥有这几种原生类型
布尔:
true false
对象:Java 对象、空指针数字:默认 Double,支持 BigInteger 或 BigDecimal、Float、Long、Byte、Integer、Short 手动解析时根据词条类型转换
字符串:Java 的
String 对象标识符(符号):Symbol 对象
S 表达式:SexpList 对象
宏:Macro 对象
详细信息可以看 KtLime 取用
Lime 是一门基于宏的语言,所有「函数调用」最终会被展开为「内部展开器」调用
宏可以被「apply」,apply(施用)的结果「application」可能是这样的:
最终所有宏都会被递归展开为 「内部展开器调用」形式
(# each (object procedure) . each object procedure)Lime 为了支持一些元编程的宏,提供了「宏前置」功能,让宏可以直接接受到没有展开过的结果
~ (each list (do (i) puts i)) ; expanded as handler dispatch ". each list (# (i) puts i)"
(^# (vararg) . show-code vararg)这样对某些参数来 apply 此宏时,不会预先进行 S 表达式展开
(print (+ 1 1)) 和符号解析 (print a) 了,直接给出没有展开的对象列表这就是 Lime 的工作原理
(-> puts (# (object) . print-line object)))
(-> let (^# (vararg) . let-syntax vararg))
(let (hello = 'Hello, world!') in
(puts hello))
duangsuse::Echo
简单的介绍一下 Lime 的工作原理 Lime 是一种简单的,基于 S-表达式的程序设计语言 Lime 拥有这几种原生类型 布尔:true false 对象:Java 对象、空指针 数字:默认 Double,支持 BigInteger 或 BigDecimal、Float、Long、Byte、Integer、Short 手动解析时根据词条类型转换 字符串:Java 的 String 对象 标识符(符号):Symbol 对象 S 表达式:SexpList 对象 宏:Macro 对象 详细信息可以看 KtLime…
在我没有做完 Gekyll 的时候,或者反正是任何时候都欢迎大家来贡献代码哦 ❤️🙂
话说,duangsuse 现在还没有写过编译性的语言实现呢,这次来一个编译到 8085 汇编的编译器吧
来源语言是一门简单的四则运算语言,因为 duangsuse 对不熟悉的原因
只能计算 32 位有符号整数,由于 duangsuse 不熟悉啥 Combinator、啥 LL、左递归右递归的就不做扩号语法了(算了,貌似最简单的... 递归下降法应该能用吧
编译器使用 C++ 编写
目标语言是 GNUSim86 支持的 8085 汇编
并且在完成算式后自动将结果格式化输出到标准输出,真希望能使用 Libc,要不然还得自己不断和 10 除法取余转换字符串...
来源语言是一门简单的四则运算语言,因为 duangsuse 对不熟悉的原因
+ - * /只能计算 32 位有符号整数,由于 duangsuse 不熟悉啥 Combinator、啥 LL、左递归右递归的就不做扩号语法了(算了,貌似最简单的... 递归下降法应该能用吧
编译器使用 C++ 编写
目标语言是 GNUSim86 支持的 8085 汇编
并且在完成算式后自动将结果格式化输出到标准输出,真希望能使用 Libc,要不然还得自己不断和 10 除法取余转换字符串...