duangsuse::Echo
719 subscribers
4.26K photos
130 videos
583 files
6.48K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
简单的介绍一下 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)

~ (each list (do (i) puts i)) ; expanded as handler dispatch ". each list (# (i) puts i)"

Lime 为了支持一些元编程的宏,提供了「宏前置」功能,让宏可以直接接受到没有展开过的结果

(^# (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))
初用 TuxGuitar... :
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from 羽毛的小白板
写 codegen 累死
Forwarded from 羽毛的小白板
思考 ast transform 的写法
那个 ActionScript 的实现?
话说,duangsuse 现在还没有写过编译性的语言实现呢,这次来一个编译到 8085 汇编的编译器吧

来源语言是一门简单的四则运算语言,因为 duangsuse 对不熟悉的原因

+ - * /

只能计算 32 位有符号整数,由于 duangsuse 不熟悉啥 Combinator、啥 LL、左递归右递归的就不做扩号语法了(算了,貌似最简单的... 递归下降法应该能用吧

编译器使用 C++ 编写

目标语言是 GNUSim86 支持的 8085 汇编
并且在完成算式后自动将结果格式化输出到标准输出,真希望能使用 Libc,要不然还得自己不断和 10 除法取余转换字符串...
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from 羽毛的小白板
ActionScript 有用的只剩虚拟机,因为有字节码,可以跳过 AS 编译的环节
不会 C++ 的 duangsuse 只能用指针 + 类型标示分开子树指针于整形的区别... 而且容易出机器位长度兼容的问题
This media is not supported in your browser
VIEW IN TELEGRAM
Lexer 的事情不知道靠 scanf() 有没用了... 毕竟我没有写过这种,或许就只能读取全部到 std::string 然后再扫描了呢
「作弊」永远是解决问题的最好途径,也是我每次能最快解决问题的方式,所以我希望大家以后遇事不要先问人,先问鸭子得到答案更快
扫描的时候有编码问题...
    int c;
while ((c = getchar()) != EOF) {
code.append((const char *) &c);
}

我的锅,把指针递出去了,看看 << 操作符能不能用...
This media is not supported in your browser
VIEW IN TELEGRAM
接下来要写解析器逻辑,因为表达式都是毕竟简单的格式

因为我对 C++ 和结合实在是可以说几乎一无所知,所以暂时不做运算符优先级了,以后慢慢思考

表达式都是这样的

1 + 1 * 2 / 3
2 * 233

编译出来是这个样子(1 + 1 为例)