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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
#PL #code #guide #daily #scheme

关于 Lice lice-lang/lice 解释器的分析

我们只看解释器实现,不看测试和文档什么的,目标为理解官方 Lice 解释器实现和汲取精华、以及提出充分利用 Kotlin 特性的建议

org/lice/api/scripting/*

javax.script 的 API 接口

我们可以看到,LiceScriptEngineFactory 类提供以下信息

LanguageVersion EngineVersion Extensions MimeTypes LanguageName Names EngineName

ScriptEngine()
OutputStatement(toDisplayString)
Program(statementsCode)

MethodCallSyntax(obj: String, mid: String, vararg args: String)

Parameter(paramString)
"javax.script.engine_version", "javax.script.language_version"
"javax.script.engine", "javax.script.language", "javax.script.name"

LiceScriptEngine 做这些

class LiceScriptEngine : JavaxScriptEngine
private var context: LiceContext = LiceContext()
getContext()
setContext(context)
setContextIfIsLiceContext()

getFactory()

eval(scriptString, context) = eval(script, context.bindings)
eval(script: String) = eval(script, context.bindings)

eval(reader: Reader) = eval(reader.readText(), context.bindings)
eval(reader: Reader, n: Bindings) = eval(reader.readText(), n)
eval(reader: Reader, context: ScriptContext)

eval(script: String, n: Bindings)

get(key: String?): Any? = context.bindings[key]
put(key: String, value: Any?)

createBindings() = SymbolList()
getBindings(scope: Int) = context.bindings
setBindings(bindings: Bindings?, scope: Int)

并且 LiceContext 做这些

bindings: SymbolList
reader: Reader
writer: Writer
errorWriter: Writer

getAttribute(name: String)
getAttribute(name: String, scope: Int)
setAttribute(name: String, value: Any?)
setAttribute(name: String, value: Any?, scope: Int)
removeAttribute(name: String) = bindings.removeVariable(name)
removeAttribute(name: String, scope: Int)

getScopes(): MutableList<Int>
getAttributesScope(name: String?): Int

getBindings(scope: Int)
setBindings(bindings: Bindings, scope: Int)

然后是 org/lice/core/*

AbstractBindings

variables: MutableMap<String, Any?>
provideFunctionWithMeta(name: String, node: ProvidedFuncWithMeta)
provideFunction
defineFunction
getVariable
defineVariable
isVariableDefined
removeVariable

containsValue
clear
putAll(from: Map<out String, Any>)
containsKey
get
put
isEmpty
remove
var size = fun ...
entries: MutableSet<LiceEntry>
keys
values
duangsuse::Echo
... 说得太详细了实在是脑洞啊 简要说一下每个类的功能(看了一点后我还是觉得 Lice 的设计有点大了... 不知道为什么)
我大概看了一遍,已经找到分词、解析器、数值类型自动提升运算工具、内部函数位置、辅助扩展函数、AST 求值逻辑位置
目前依然需要确定的可能是内部函数分派逻辑

刚才去迂腐的编译原理裙里看看,冰封不在所以为啥要给 Kotlin 的内部 handler 加 mangle 我就没问到
然后我怂了... 因为我感觉 InScript + JNI Bison + Flex Lexer 会更好玩一些,之前没玩过,都是自写的分词器,然后递归下降 Recursive descent method 解析器不会写... 二元运算优先级和左优先级右优先级不了解... 所以都不知道如何整理 BinaryNode

不过我还是乐意出一个支持最新基本词法语法定义的 Lime 去和 Lice 比速度
平时指令式 imperative 写多了声明式 declarative 写少了的 duangsuse 不会看满屏括号(
至少不知 C++ template 元编程 metaprogramming 为何物
#Python #Low #PL #backend #web #async

https://news.cnblogs.com/n/602997/

真是 Low 到爆炸了,官方 asyncio 做不好、GC 不优化、2 to 3 不考虑常情、语言语法定义垃圾、内部开发者政治得要死也配当工业级别的语言
每次开团讨论总是会出现各种各样的问题...
我还是更喜欢基于虚拟机的 Scheme 实现,并且已经准备好开始设计了...
This media is not supported in your browser
VIEW IN TELEGRAM
还是打算 JVM 开发,底层的事情从不操心