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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
写了 ParserTests,还有一个测试不能过,急,在线等
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
lime-parser.zip
#PL #project 完整 Lime parser 完成,带了 tests 和 javadoc
现在不包含 Kotlin std 在内的体积 27k
准确的说应该叫 KtLime,拿 Java 重写很简单的
Kotlin 有尾递归比较方便使用,而且总体性能比 Java 强
## 基本数据类型

+ nil ()
+ bool #t #f
+ number 01 0x1 0b1001 0o122 2323N 32323D 2233.223F 66666L 6B
+ list (a b c)
+ string '' "" "\"" "\n"

### 行注释

; comment

任何不可识别的都作为标识符

p.s. 冰封波博客上那个字符串 escape 失败不报错作为标识符的真是奇妙

## 展开规则:

+ 对任何宏:检查参数列表长度,对所有参数 s-expression 列表递归展开并对标识符解引用,然后填充宏参数递归展开,如果是 varargs 宏就直接将求值后的列表填充到 varargs 参数里
+ 对 ^* 宏:检查参数列表长度,然后填充宏参数递归展开,如果是 varargs 宏就直接将求值后的列表填充到 varargs 参数里
+ 对 . 宏:检查对应 send handler 参数列表长度,将所有参数 s-expression 列表递归展开并对标识符解引用,发送调用到处理 handler

## 插件:

0. 提供 ext ext~ macro 和 onLoad(Llime/Lime)V`、`onUnload(Llime/Lime)V`,插件类统一叫 `LimePlugin
1. 取值 hook
2. 找不到变量 procedure
3. SEND handler
4. 错误 hook

## 作用域:

全局变量 args 在每次递归展开时有效,它是惰性求值的

全局变量 __stack 储存了所有作用域表
不过它是惰性求值的

Lime 使用嵌套作用域

全局变量 __env 表示整个 Lime 全局表

__lime 表示解释器对象
(-> boys ([str Rikka ice100 pandecheng Yutta))
(-> say-hello (# (name)
(@ name " 女装哦 🌚")))
(each boys say-hello)
java -cp out/production/Lime/:/opt/android-studio/lib/kotlin-runtime.jar lime.ParserMain
(
:->
:boys
(
:[str
:Rikka
:ice100
:pandecheng
:Yutta
)
)
(
:->
:say-hello
(
:#
(
:name
)
(
:@
:name
女装哦 🌚
)
)
)
(
:each
:boys
:say-hello
)
那么现在就把这些作为内建的 macro(真正内建的只有 handler)

-> define
-? defined?
-x undef
<- read (mp)
. send
=> hash
# macro
: to_symbol
->s to_string
[str string_array
~~ must_sequence
` loop
`` must_loop
? cond
% typeof
:: index
::= index_eq
ext extension_load
ext~ extenseion_unload
require require_library
eval eval
^ car
$ cdr
@ puts
@! warn
@< gets
λ lambda
#< macro_args (mp)
#> macro_body (mp)
[] square_index
[]= square_index_eq
[]? has_key?
[]- ary_length
[]* keys
str-includes
str-match
+ add
++ inc
- sub
-- dec
* mul
/ div
** pwr
% mod
> lt
< bg
>= le
< be
& and
| or
! not
^ xor
<< shl
>> shr
$type-># to_macro
p print
!! raise
r valueof
This media is not supported in your browser
VIEW IN TELEGRAM
自动类型提升....
先不做
复制 lice 的?