program-in-chinese / overview

中文编程的历史、现状和展望。issue 中进行相关问题的讨论.
https://zhuanlan.zhihu.com/codeInChinese
GNU General Public License v3.0
383 stars 34 forks source link

The Language此次重寫 #129

Closed zaoqi-unsafe closed 5 years ago

zaoqi-unsafe commented 5 years ago

與github.com/the-language/js正在重寫。希望能在下個學期開始前完成 文檔未開始寫。 產生了幾種新的語言,它們的單詞將會可以顯示爲各種自然語言的。

zaoqi-unsafe commented 5 years ago

新發明特性,設計列表

nobodxbodon commented 5 years ago

停機問題的避免

请先在https://github.com/program-in-chinese/overview/issues/106 说明怎样算"避免". 之后再讨论其他的.

zaoqi-unsafe commented 5 years ago

@nobodxbodon 通過允許編譯解釋器分步的替換沒有值的表達式。 一般的,沒有值是在n次替換後,如果不繼續替換,永遠得不到結果。 實現這個替換可以留到很久以後,因爲比較不重要,難度有點大。

zaoqi-unsafe commented 5 years ago

@nobodxbodon 在a=b,b=a等情況時,替換可以產生幾種不同的結果,所以對語言的定義有一些影響。

zaoqi-unsafe commented 5 years ago

@nobodxbodon 說明完畢

zaoqi-unsafe commented 5 years ago

如果停機問題"被解決",那麼根據模糊的定義,下面定義的(x)會被替換。所以和停機問題不同。

(define (x)
(if (run-forever? x) '() (x)))
nobodxbodon commented 5 years ago

@zaoqi-unsafe

通過允許編譯解釋器分步的替換沒有值的表達式

如何判断一个表达式"没有值"? 举个例子?

zaoqi-unsafe commented 5 years ago

我已經說了

實現這個替換可以留到很久以後,因爲比較不重要,難度有點大。 一般的,沒有值是在n次替換後,如果不繼續替換,永遠得不到結果。

zaoqi-unsafe commented 5 years ago

@nobodxbodon

nobodxbodon commented 5 years ago

@zaoqi-unsafe

實現這個替換可以留到很久以後,因爲比較不重要,難度有點大。

意思是打算把这个特性暂时跳过?

沒有值是在n次替換後

"替换"的意思是? 这个n怎么取?

zaoqi-unsafe commented 5 years ago

@nobodxbodon 替換爲錯誤。 n是任意自然數

zaoqi-unsafe commented 5 years ago

@nobodxbodon 替換爲錯誤。 n是任意自然數

zaoqi-unsafe commented 5 years ago

@nobodxbodon 替換爲錯誤。 n是任意自然數

zaoqi-unsafe commented 5 years ago

@nobodxbodon 替換爲錯誤。 n是任意自然數

nobodxbodon commented 5 years ago

@zaoqi-unsafe 先从简单例子开始吧. 如何判断下面是死循环?

while(true) {
;
}
zaoqi-unsafe commented 5 years ago

@nobodxbodon 核心語言是lazy函數式的。

zaoqi-unsafe commented 5 years ago

是打算把这个特性暂时跳过

zaoqi-unsafe commented 5 years ago

實現此特性的方法足夠寫一個什麼樣的Paper,然後發表在什麼什麼地方

zaoqi-unsafe commented 5 years ago

這種例子通過直接比較代碼可解決

nobodxbodon commented 5 years ago

@zaoqi-unsafe 可否将列表中其他不打算在寒假期间完成的先删去? 再对剩下的每项加些说明(或举个例子), 以便继续讨论?

zaoqi-unsafe commented 5 years ago

停機問題的避免 現在是語言文檔中的文字,不需刪去。

zaoqi-unsafe commented 5 years ago

文本的表示中允許沒有計算完的東西 是這種東西:(偽Scheme代碼)

(不是被eval的東西 $(() (+ 1 1)))

等於

(不是被eval的東西 2)
zaoqi-unsafe commented 5 years ago

核心語言是lazy無副作用的。某些情況下需要這個特性。

zaoqi-unsafe commented 5 years ago

macro是值: macro是一種非基本數據類型。 偽代碼(new-data 'macro '(f))。f是一個函數,類型為Env, ... -> Any。返回的為已經計算好的,不會再eval。 用一種與使用函數不同的語法使用macro。

zaoqi-unsafe commented 5 years ago

優化可用爲平臺定製,並且不混在實現裏

編譯解釋器可以優化特定的代碼,因為自然數等東西不是內建的。也允許其他人寫的優化。在代碼更新時,優化自動失效,不會因此產生bug。

zaoqi-unsafe commented 5 years ago

無政府的包管理器

這是一個包,可以選擇的一個方案,非內建。 依賴以某種結構直接嵌入代碼里。 編輯器可以自動隱藏依賴的代碼。會實現一個工具自動更新依賴的代碼。 需要無政府的包管理器的一個原因是在某些情況下(航天等),通訊需要很多時間

zaoqi-unsafe commented 5 years ago

函數是一種普通的可以分割的東西

這是已經存在於動態作用域語言的設計 比如某些lisp的(lambda ...)'(lambda ...) 核心語言沒有動態靜態作用域。沒有提供方便的實現動態作用域的特性,靜態作用域被實現。

zaoqi commented 5 years ago

@nobodxbodon 部分没有值的情况已经可以被检测到

nobodxbodon commented 5 years ago

@zaoqi

部分没有值的情况已经可以被检测到

可否先说明是哪些情况? 有参考资料/论文的话也请帖一下. 另外, 可否就这里举的字符串算法例子演示一下如何检测(针对某一个输入值)

nobodxbodon commented 5 years ago

@zaoqi 尚未找到相关论文, 但有不少讨论, 如这里的思路:

For example you could write an algorithm that returns "Yes, it terminates" for any program which contains neither loops nor recursion and "No, it does not terminate" for any program that contains a while(true) loop that will definitely be reached and doesn't contain a break statement, and "Dunno" for everything else.

请问你的功能有哪些不同?

zaoqi commented 5 years ago

https://www.quora.com/Can-the-Halting-Problem-be-avoided-by-checking-every-possible-input/answer/Michal-Fori%C5%A1ek好像无法查看。 我设计的是替换“没有值”,完整的算法应该是可能存在的。

zaoqi commented 5 years ago

这样设计不影响正常算法的书写,也可能可以使解释器能做到总是停机

zaoqi commented 5 years ago

部分情况是在化简表达式过程中发现循环

zaoqi commented 5 years ago

在force_all函数里

nobodxbodon commented 5 years ago

@zaoqi

如果确定要将"可以判断某些无法停止的程序"作为一个特性, 请先说明可判定的程序&输入值范围, 最好有实例(伪代码亦可).

quora链接的例子如下:

Consider the following simple string-rewriting algorithm:

rules = { 'a':'bc', 'b':'a', 'c':'aaa' }
n = int(input())
S = 'a'*n         # a string of n 'a's
while len(S) > 1: S = S[2:] + rules[S[0]]

It doesn't get much simpler than this: in each step, remove two letters from the beginning, and append a few new letters at the end. Here's what the program does for n=10 if we print S after each iteration of the while-cycle:

aaaaaaaabc
aaaaaabcbc
aaaabcbcbc
aabcbcbcbc
bcbcbcbcbc
bcbcbcbca
bcbcbcaa
bcbcaaa
bcaaaa
aaaaa
aaabc
abcbc
cbcbc
cbcaaa
caaaaaa
aaaaaaaa
aaaaaabc
aaaabcbc
aabcbcbc
bcbcbcbc
bcbcbca
bcbcaa
bcaaa
aaaa
aabc
bcbc
bca
aa
bc
a
zaoqi commented 5 years ago

@nobodxbodon 是"没有值",核心是函数式。 替换为错误会影响语言的定义,所以需要写出来。 我的那个解释器现在可以检测 ^(#(化滅 (甲) (甲 甲)) (#(化滅 (甲) (甲 甲))))这种

nobodxbodon commented 5 years ago

^(#(化滅 (甲) (甲 甲)) (#(化滅 (甲) (甲 甲))))这种

可否用等价的scheme代码演示? 否则新用户估计很难理解.

替换为错误会影响语言的定义,所以需要写出来。

不理解. "替换为错误"是编译器对代码进行的转换? 对程序输出有何影响? 又为何会"影响语言的定义"?

zaoqi commented 5 years ago

(define (f x) (x x)) (f f)

zaoqi commented 5 years ago

@nobodxbodon 没有值和那种错误 本来是不等价的

nobodxbodon commented 5 years ago

(define (f x) (x x)) (f f)

仅看此例猜不出范围. 是"所有不能收敛的递归"? 自身递归还是可以多函数互相调用的递归? 参数必须是函数本身还是可以是任意值? 如楼上所言, "请先说明可判定的程序&输入值范围"

zaoqi commented 5 years ago

(define (f x) (x x)) (f f)

仅看此例猜不出范围. 是"所有不能收敛的递归"? 自身递归还是可以多函数互相调用的递归? 参数必须是函数本身还是可以是任意值? 如楼上所言, "请先说明可判定的程序&输入值范围"

@nobodxbodon 語言本身的標準沒有限制。 現在的實現可判斷化簡過程中出現的循環

zaoqi commented 5 years ago

@nobodxbodon 沒有給語言使用者判定,是替換(解釋)沒有值的表達式為錯誤

zaoqi commented 5 years ago

這里的值是The Little Typer中的value

bctnry commented 5 years ago

你真是愚昧无知到了不可理喻的地步,不仅在我斥责后还来骚扰我,而且竟然还骚扰Dan Friedman。

听着:

你的issue不会被reopen也不应该被reopen。你应该就此彻底闭嘴,认真读书,反省你的愚昧言行,将现在的错误想法彻底抛弃。

zaoqi commented 5 years ago

@bctnry 我可能確實沒有說清楚 替換是由編譯解釋器實現的,使用者不能直接選擇。 我只要可計算的東西能和之前一樣寫出來,並且還可以計算,不需要你說的“Turing完全”。

zaoqi commented 5 years ago

@bctnry 你認為

* 假如你做出来了,你的语言就一定不会是图灵完全的,

那麼肯定會影響語言本身,所以需要寫出來

zaoqi commented 5 years ago

@bctnry

你口口声声说将「没有值」的部分替换成错误,但是「不停机」就一定「没有值」,所以你一定会需要解决不停机的情况,因此你是在用能解决一个更为困难的问题的方法解决一个不那么困难的问题,而这两个问题在图灵完全的情况下都是绝对不可能解决的。

(define last-try (lambda (x) (and (will-stop? last-try) (eternity x))))

這裡(will-stop? last-try)(last-try '()) 都是沒有值的東西,導致我暫時找不到證明完整的算法不存在的方法

zaoqi commented 5 years ago

@xieyuheng 好多人沒讀懂,好像有點奇怪: @bctnry 和Chariette XuQQ:3150038535和@nobodxbodon等人

nobodxbodon commented 5 years ago

@zaoqi 这个特性, 如果是学术探索, 需要对目标和解决方案进行严谨的描述, 最好引用参考资料, 阐述与前人工作的不同之处; 如果是一个工程特性, 是为了推广而给潜在语言使用者的看的, 最好尽量易懂地将它的好处与应用范围描述出来, 并用实例进行演示, 使对语言不了解的人可以清楚了解它的用法.

bctnry commented 5 years ago

@zaoqi 你车轱辘话来回说,还敢怨别人没看懂???