我又要继续写关系式求解器了……
首先来看看 six primitives : State, Variable, Introduce
然后 Equal, Both, Either
那么怎么对 unification 进行可扩展的建模呢…… 先写点东西
首先来看看 six primitives : State, Variable, Introduce
然后 Equal, Both, Either
那么怎么对 unification 进行可扩展的建模呢…… 先写点东西
sealed class Either<A, B> {
data class Left<A>(val value: A): Either<A, Nothing>()
data class Right<B>(val value: B): Either<Nothing, B>()
val left: A? get() = (this as? Left<A>)?.value
val right: B? get() = (this as? Right<B>)?.value
fun mustLeft() = left ?: throw AssertionError("$this not left")
fun mustRight() = right ?: throw AssertionError("$this not right")
fun <R> fold(trans_left: (A) -> R, trans_right: (B) -> R): R = when (this) {
is Left -> trans_left(this.value)
is Right -> trans_right(this.value)
}
}https://mohu.pincong.rocks/question/
🤔 最近膜乎的链接都过期了,有简单的等价链接,我找不到合理的 URL replace Firefox 插件,自己写一个去。
🤔我简直是变态…… 为什么要写 format()……
🤔 最近膜乎的链接都过期了,有简单的等价链接,我找不到合理的 URL replace Firefox 插件,自己写一个去。
function onLink(url) {
for (let [pat, dst] of settings.replaceMap) {
let match = pat.exec(url);
if (match != null) { redirect(format(dst, i => match[i])); }
}
}
function drop(n, str) { return str.substring(n, str.length); }
function format(str, replace, prefix = '\\', take = view => /(\d+)/y.exec(view)[1], transform = Number.parseInt) {
let view = str;
let replaced = [];
while (view.length > 0) {
if (view.startsWith(prefix)) {
let took = take(view);
view = drop(took.length, view);
replaced.push( replace(transform(took)) );
} else {
let prefixIdx = view.indexOf(prefix);
if (prefixIdx == (-1)) prefixIdx = view.length;
replaced.push( view.substring(0, prefixIdx) );
view = drop(prefixIdx, view);
}
}
return replaced.join("");
} 🤔我简直是变态…… 为什么要写 format()……
function drop(n, str) { return str.substring(n, str.length); }
function format(str, replace, prefix = '\\' , take = view => /(\d+)/.exec(view)[0], transform = Number.parseInt) {
let view = str;
let result = [];
while (view.length != 0) {
let prefixIdx = view.indexOf(prefix); if (prefixIdx == (-1)) break;
result.push( view.substring(0, prefixIdx) );
view = drop(prefixIdx+prefix.length, view);
let took = take(view);
if (took == null) throw SyntaxError(`Unexpected ${view} after ${prefix}`);
result.push( replace(transform(took)) );
view = drop(took.length, view);
}
result.push(view);
return result.join("");
}🤔 刚才在想,如果要定义 DOM 树的模式并同时允许正向组织和反向提取,一组动词叫什么,试了 unrender, extract, dump, match 等都觉得不合适,后来发现 render/scrape 是最合适的
请查阅源代码提交政策。 您使用了下列任何一种工具吗?
Code generators or minifiers
将多个文件合并为一的工具,例如 webpack
Web 模板引擎,对于 HTML 和 CSS
任何对代码或文件二次处理,并生成附加组件中的代码或文件的其他工具
🤔
Code generators or minifiers
将多个文件合并为一的工具,例如 webpack
Web 模板引擎,对于 HTML 和 CSS
任何对代码或文件二次处理,并生成附加组件中的代码或文件的其他工具
🤔
function switcher(e) {
const url = new URL(e.url);
return { redirectUrl: url.href };
}
function update_switching() {
if(browser.webRequest.onBeforeRequest.hasListener(switcher))
browser.webRequest.onBeforeRequest.removeListener(switcher);
if (patterned.length == 0) return;
browser.webRequest.onBeforeRequest.addListener(switcher, {urls: patterned}, ["blocking"]);
} 🤔从隔壁一个扩展抄过来的东西
duangsuse::Echo
#DontKnow 🤔早上我起床前问了下duangsuse (自言自语) 代码风格上,为什么要把 ES6 generator 的 * 直接贴在 function 的后面呢 回答说,因为这样语义更明确, generator function 就是 function*。 那 C++ 里为什么要写 Ui::MainWindow* ui; 呢? “语义更明确,指针当然要贴着类型” 等等…… int *a, *b; 呢 “🤪看来以后得区别对待 C 和 ES6 的星号了”
* 号可能是生成器语句操作符的名字的一部分。
—
duangsuse 批注:ES6 里应该有
—
duangsuse 批注:ES6 里应该有
yield* 的,不过我还是会把星号放前面