(-> 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
依然可以使用
准备发布可以在 JSE 上运行带 Kotlin std 的版本,然后开始实现标准库宏
Lime#loadExtClass(Class) 和 Lime#defineMacro 、 Lime.handlers#put 来定义标准库准备发布可以在 JSE 上运行带 Kotlin std 的版本,然后开始实现标准库宏
能正常使用的证明:
~/AndroidStudioProjects/Lime/out/artifacts/Jar$ . /opt/android-studio/plugins/Kotlin/kotlinc/bin/kotlinc -cp Lime.jarWelcome to Kotlin version 1.2.30 (JRE 9.0.4+12-Debian-4)
Type :help for help, :quit for quit
>>> import lime.*
val sexp = Lime.parse("(print a b c)")[0]!! as SexpressionListval lime = Lime(sexp)lime.defineMacro("print", "varargs", "(. print varargs)")companion object o {@JvmStatic fun print(o: Array<Any?>): Any? {println(o)return o}}lime.handlers.put(Symbol("print"), o::class.java.getDeclaredMethods()[0])