duangsuse::Echo
内部定义的宏: -> define -? defined? -x undef <- read . send => hash # macro : as_symbol :< back_symbol :' as_sexp ' as_array " as_string_array ~ sequence ~~ must_sequence ` loop `` must_loop ? cond % typeof :: index ::= indexeq ext< loadext ext> unloadext require…
有不少定义混淆了,其实他们是按照操作数选择定义的...
(% 10 5) ;=>0
(% 10) ;=> "lnumeric"
duangsuse::Echo
我想 ((" foo bar 2k).join :+) std::Symbol::#-># 🌚
其实去掉
反而更好一些,但我不确定....
: 也行 🌚反而更好一些,但我不确定....
duangsuse::Echo
既然转型的函数都有了我还不如内建 OOP 算了(
不如做成 OOP 算了(逃跑
本来让插件重写
本来让插件重写
reference_missing 不就可以了吗(
duangsuse::Echo
有不少定义混淆了,其实他们是按照操作数选择定义的... (% 10 5) ;=>0 (% 10) ;=> "lnumeric"
一片混乱 🙈
这时还没考虑到内建 OO 的情况
这时还没考虑到内建 OO 的情况
duangsuse::Echo
一片混乱 🙈 这时还没考虑到内建 OO 的情况
其实 Lime 内建 OO 遵循一个非常简单的原则:
Lime 解释器展开 S-表达式时会对 Symbol 原子解引用
一般情况下,直接在环境Hash中寻找那个被引用的对象,如果找不到就转给 reference_missing 让它解决(默认总是抛出 ReferenceNotFoundError 异常)
OO 却不这样,对找不到的引用执行以下操作:
`oop_ref`具体做的就是以 '.' 和 '::' 切分 ref, 从左到右 join 处理路径
:: 规则:
对左表达式求值,断言结果是 Hash
如果右表达式以 '=' 结尾,返回一个宏, 类似这样:
否则,使用rhs index左表达式求值结果
. 规则:
对左表达式求值
和 :: 不同,`.` 不要求 lhs 必须是 Hash, 它会按照以下映射规则为对象寻找类:
如果不能找到,它依然会抛出错误
如果 lhs 是 Hash,
如果结果是nil(没找到), 尝试进行方法查找:
(暂时不打算缓存和内联优化什么的
查找过程中会使用到 _class “指针” 和 _superclass “指针”:
上面的映射类有用处辣! 🌝, 映射类型会作为对象的类来检查
通过 _class 字段获取到对象的类(依然是求值),使用类似 Ruby 的方法查找算法遍历超类链检查
接下来就是填充
不然呢? 如果找不到方法, Lime 会调用 Ruby 代码里的 lime_method_missing, 默认实现是在lhs上和寻找正常方法一样寻找
否则
如果结果是 Macro, 使用 lhs 作为 self 对这个 Macro 进行填充,返回填充后的 Macro, 否则返回结果
Lime 解释器展开 S-表达式时会对 Symbol 原子解引用
一般情况下,直接在环境Hash中寻找那个被引用的对象,如果找不到就转给 reference_missing 让它解决(默认总是抛出 ReferenceNotFoundError 异常)
OO 却不这样,对找不到的引用执行以下操作:
unless ref.include? '.' or ref.include? '::'
call_reference_missing
else
unless ref.start_with '.' or ref.end_with '.' or ref.start_with '::' or ref.end_with '::'
call_oop_ref
else
call_reference_missing
`oop_ref`具体做的就是以 '.' 和 '::' 切分 ref, 从左到右 join 处理路径
:: 规则:
对左表达式求值,断言结果是 Hash
如果右表达式以 '=' 结尾,返回一个宏, 类似这样:
A::B::v=(# (v) (::= (:: A B) b v))否则,使用rhs index左表达式求值结果
. 规则:
对左表达式求值
(r lhs)和 :: 不同,`.` 不要求 lhs 必须是 Hash, 它会按照以下映射规则为对象寻找类:
Macro -> std::Macro
List -> std::List
Hash -> std::Hash
String -> std::String
Symbol -> std::Symbol
Bool -> std::Bool
Number -> std::Number
Nil -> std::Nil
如果不能找到,它依然会抛出错误
如果 lhs 是 Hash,
. 先和 :: 一样索引,但接下来分出了两种情况:如果结果是nil(没找到), 尝试进行方法查找:
(暂时不打算缓存和内联优化什么的
查找过程中会使用到 _class “指针” 和 _superclass “指针”:
上面的映射类有用处辣! 🌝, 映射类型会作为对象的类来检查
通过 _class 字段获取到对象的类(依然是求值),使用类似 Ruby 的方法查找算法遍历超类链检查
#methodname 字段, 如果成功,大功告成!(现在还不打算支持重载,况且 OOP 本来就只是附加特性,Lime 本质上和 m4 是一样的语言)接下来就是填充
self 的工作了,这会返回填充完成的宏,允许赛艇的写法。不然呢? 如果找不到方法, Lime 会调用 Ruby 代码里的 lime_method_missing, 默认实现是在lhs上和寻找正常方法一样寻找
method_missing, 调用它,如果依然找不到(喷)就抛出异常否则
如果结果是 Macro, 使用 lhs 作为 self 对这个 Macro 进行填充,返回填充后的 Macro, 否则返回结果
duangsuse::Echo
其实 Lime 内建 OO 遵循一个非常简单的原则: Lime 解释器展开 S-表达式时会对 Symbol 原子解引用 一般情况下,直接在环境Hash中寻找那个被引用的对象,如果找不到就转给 reference_missing 让它解决(默认总是抛出 ReferenceNotFoundError 异常) OO 却不这样,对找不到的引用执行以下操作: unless ref.include? '.' or ref.include? '::' call_reference_missing else unless…
这样就可以写出类似如此的代码:
... 不想编了
(class std::String
(def a_monkey?
self.start_with 'm))
(p ('mastermm'.a_monkey?))
... 不想编了
duangsuse::Echo
这样就可以写出类似如此的代码: (class std::String (def a_monkey? self.start_with 'm)) (p ('mastermm'.a_monkey?)) ... 不想编了
class 求值第一个参数时就已经获得
在 Ruby 里这是 env[:std][:String]
(:: std String) (String 类的引用) 了在 Ruby 里这是 env[:std][:String]
duangsuse::Echo
这样就可以写出类似如此的代码: (class std::String (def a_monkey? self.start_with 'm)) (p ('mastermm'.a_monkey?)) ... 不想编了
list 里第一个表达式永远会被视为 Symbol, 要不然上面的那些定义也会被语法覆盖掉啊(
Ruby Lime 解释器设计为分三块,
lime 为辅助库,也包含帝递归展开函数lime/engine 是 Lime 解释器引擎的线程安全封装lime/parser 是独立的 Lime sexp parserlime/builtins 是内部默认预定义宏仓库, Lime::Builtins 继承于 Lime::BuiltinsBase, 这个类是 lime.rb 中定义的require 'lime/engine'
engine = Lime::Engine.new
engine.macro(:fortune) do |body, saying|
puts "#{body}: #{saying}"
end
engine[:picasso] = { name: 'Picasso', saying: '(......wtf???)' }
engine.eval '(fortune picasso::name picasso::saying)'
Picasso: (......wtf???)
duangsuse::Echo
#project Lime 今天下午又有一些变更,总的来说: 1. OOP 支持, Ruby 由于足够灵活方便所以(Ruby 版本)没有内建,而是包 std/oop 使用插件(当然也有 Lime)实现的 具体工作方法可以等 wiki 例子: (10.times (do (th) (puts "Hello, world! #:#{th}"))) (-> File std::File) (-> a_file (File::open 'a.txt :r)) (puts (a_file.read)) F…
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
require 'lime/engine' engine = Lime::Engine.new engine.macro(:fortune) do |body, saying| puts "#{body}: #{saying}" end engine[:picasso] = { name: 'Picasso', saying: '(......wtf???)' } engine.eval '(fortune picasso::name picasso::saying)' Picasso: (......wtf???)
#android Via 好像也是开源了文本允许翻译
Forwarded from Deleted Account
纯纯写作开源了字符串资源文件:
https://github.com/drakeet/resources/blob/master/translations/en/strings.xml
并求在行的日语、俄语、西班牙语、荷兰语、印地语等翻译,有偿(大概 50 元)或加入翻译贡献者都可以(这样的话也都会赠送免费激活码或兑换码
https://github.com/drakeet/resources/blob/master/translations/en/strings.xml
并求在行的日语、俄语、西班牙语、荷兰语、印地语等翻译,有偿(大概 50 元)或加入翻译贡献者都可以(这样的话也都会赠送免费激活码或兑换码
duangsuse::Echo
熬两个多小时写这些感觉赛艇(
今天标准函数修订了几个并且添加了异常系统
(好像忘了几个变更... 不过应该也够了,算
(好像忘了几个变更... 不过应该也够了,算
递归展开定义针对列表并断言列表首项是 .或可以被转化成 Macro 形式
递归展开过程只做以下几件事:
空列表被展开为 nil
首项为 :. 的列表交给内部展开器处理
如果首项是列表,直接处理余下的部分,然后尝试展开首项列表,如果展开结果不是 Macro 则尝试调用结果的
如果是符号,对其前置 '^' 处理然后进行解引用,如果得到的不是 Macro, 尝试转型,如果失败就抛出异常
使用rest对Macro进行展开,然后递归对展开结果求值
接下来处理余下部分
如果首项是符号,对其进行解引用,如果得到的不是 Macro, 尝试转型,如果失败就抛出异常
如果是其他对象,尝试
接下来使用已经展开的rest对Macro进行展开,然后递归对展开结果求值
递归展开过程只做以下几件事:
空列表被展开为 nil
首项为 :. 的列表交给内部展开器处理
如果首项是列表,直接处理余下的部分,然后尝试展开首项列表,如果展开结果不是 Macro 则尝试调用结果的
-># 方法(Lime OO 系统里一切皆对象),如果没找到或依然获得非Macro对象即抛出异常如果是符号,对其前置 '^' 处理然后进行解引用,如果得到的不是 Macro, 尝试转型,如果失败就抛出异常
使用rest对Macro进行展开,然后递归对展开结果求值
接下来处理余下部分
如果首项是符号,对其进行解引用,如果得到的不是 Macro, 尝试转型,如果失败就抛出异常
如果是其他对象,尝试
->#, 如果失败就抛出异常接下来使用已经展开的rest对Macro进行展开,然后递归对展开结果求值
duangsuse::Echo
递归展开定义针对列表并断言列表首项是 .或可以被转化成 Macro 形式 递归展开过程只做以下几件事: 空列表被展开为 nil 首项为 :. 的列表交给内部展开器处理 如果首项是列表,直接处理余下的部分,然后尝试展开首项列表,如果展开结果不是 Macro 则尝试调用结果的 -># 方法(Lime OO 系统里一切皆对象),如果没找到或依然获得非Macro对象即抛出异常 如果是符号,对其前置 '^' 处理然后进行解引用,如果得到的不是 Macro, 尝试转型,如果失败就抛出异常 使用rest对Macro进行展开,然后递归对展开结果求值…
(require foo) (require 'foo')会在以下几个位置寻找
foo 库:$LIME_LIBPATH/libfoo.lime$LIME_LIBPATH/foo/lib.lime$__/lib/foo.lime(require ./foo) 会在加载请求脚本的同级别目录下拼接 foo./foo.lime(require ./foo.lime)./foo.lime(ext< foo)$__/extensions/foo.rb (在 Ruby 里)$__/extensions/foo.class (Java)如果不存在,
$__/foo.rb