-
Notifications
You must be signed in to change notification settings - Fork 8
/
log.txt
260 lines (232 loc) · 15.3 KB
/
log.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
~%~%~%~%~%~%~%~ p r o j e c t - k ~%~%~%~%~%~%~%~
A Forth programming language implementation with the
same JavaScript *kernel* for many different applications.
The project focuses on the JavaScript *kernel*.
Everything else is just for DEMO and auxiliary.
http://github.com/hcchengithub/project-k
---------- developping log --------------------------------------------------------------
[x] hcchen5600 2015/04/28 11:03:11
嘗試用 jeforth.3we 來引入爽哥的 jeForthVM.js 如此即可借用 jeforth.3we 的人機介面以及
現成的種種方便。還可以做 performance 的比較。這個辦法是先前玩 transpiler 時發展出來的。
[x] 不容易看懂 The "multitaskjavascripteforth" porject,另謀它途。既然最大的差別是 inner loop
何不直接比一下速度?
for multitaskjavascripteforth
code swap function(){
var b=dStk.pop(), a=dStk.pop();
dStk.push(b);
dStk.push(a);
} end-code
code precise-time(mS) function(){dStk.push((new Date()).getTime())} end-code
code space function(){type(" ")} end-code
: speed-test 0 swap for 1+ next ;
precise-time(mS) 1000000 speed-test . space precise-time(mS) swap - .
for jeforth.3we 同上兩行。
結果:
multitaskjavascripteforth ~ 4000
jeforth.3we ~ 660 快了約 6 倍。
所以,先別管 inner loop 的差別了。
[x] "multitaskjavascripteforth" 的十一條建議:
1、exec(tib) 建議命名為 dictate(tib) , 英文 Dictate(吩咐)似乎像
在對 Forth 交代工作。hcchen5600 2015/04/27 15:18:26
2、waiting 以及 resume 如何運作,需要指導。 hcchen5600 2015/04/27 15:20:02
3、建議以 comma(x) 為名。x is anything, 配合 tick(name) 成為
comma(tick(‘wordName’)) 即可編譯 word 進字典。 hcchen5600 2015/04/27 15:25:22
4、rstack 或 rStack 不要簡寫。 hcchen5600 2015/04/27 15:26:26
5、用得很多,建議單稱 stack , 不要簡寫。
6、用得很多,建議直接命名為 push(t) 。 hcchen5600 2015/04/27 15:28:49
7、建議稱為 tick(n) hcchen5600 2015/04/27 15:34:57
8、稱為 comma(x) , 配合 tick(n) 使用:comma(tick(‘namd’))
9、var w = new Word(‘name’); last().xt = function(){…}; last().vid = ‘forth’;
這樣比較好懂,也符合 forth 的慣例 (例如 immediate 就是等前一個 word 產生之
後才填的屬性) hcchen5600 2015/04/27 16:16:16
10、建議提供 last(void) , 故 last().compileOnly=true; last().immediate=true; 感
覺比簡寫好。 hcchen5600 2015/04/27 16:18:15
11、另一種設計是: vocs = [‘forth’, ‘assembler’, ‘excel’, ‘canvas’]; words.forth[]
是 forth vocabulary, 另有 words.assembler[], words.excel[], 以及 words.canvas[] 等。
用哪一種好,應該怎麼決定? hcchen5600 2015/04/27 16:23:00
[x] project-k introduction to FigTaiwan
[ ] 主動用 Google polling 催請 FigTaiwan 回覆意見
[ ] introduce to lang.forth after FigTaiwan approve it.
[X] jeforth.js 的結構如下,這樣好嗎?
---- jeforth.js 只有三塊,如下三行 ----
"uses strict";
function jeForth(){。。。} // 定義 Forth VM constructor
if (typeof exports!='undefined') exports.jeForth = jeForth; // export for Node.js APP
----------------------------
[X] Forth VM constructor 命名 KsanaVM() 請賜意見。==> jeForth()
[x] jeforth.js 的產出就是一個 Forth VM constructor,而非一個 instance。所
以 instance 可以任意命名。例如 var vm = new jeForth();
[x] 審查 jeforth.js, 引入 var g = {}; // global hash
這個 hash table 用來讓 Forth 的 global variables 直接與 JavaScript 互通。
例如 52 constant myAge 則 JavaScript g.myAge 就是 Forth myAge 的 PFA。
請賜意見。
==> 還得請示意見就表示太過頭了,直接拿掉,當成「建議」recommendation 即可。
有興趣的 implementation 應由 main program, say index.html, 引入 vm.g 實現。
[x] 目前這個 g structure 沒有管理機制。用著用著可能 properties 會重複、覆蓋、衝突。
請賜意見。
==> 同上,由 each implementation 各自決定。
[x] TIB string / #TIB pointer 的命名:
tib / ntib
tib / itib <===== 用這個
或別的,這需不需要注意?請賜意見。
[x] root vocabulary should be root. Modify baby.html and bbt.html.
一改成 root 馬上感受到麻煩。因為一開始沒有 vocabulary 可用,必須用直接填的才能切換。應該還好。
[x] 我還是要提供 bbt.html 表示 jeForth 的能耐,最好能 demo 一下 h2o.f 更好。
==> No. 只提供 baby.html,要完整的 forth 系統直接介紹 jeforth.3we。
[x] change all kvm to vm.
[x] remove kernel.js , kernel.f
[ ] 上英文社群推廣 jeforth kernel。
[x] textarea 稱作 jeforth.f 會引起誤會,以為是讀 file 進來的。改稱 source_code 即可。
[x] 報告進度 hcchen5600 2015/05/17 06:22:45
> 要把 JeForth 包裝,註解,範例,一樣一樣的做好
整個 project 只有一個檔案: 20k 不到的 jeforth.js,已經做好了。含 GitHub 必
須的 README.md, 範例 baby.html 也完成。這是一個超小的小 project. 我覺得
既小就讓它一次小個夠,以收令人一看便覺得「還有半小時,不妨看一看」的鼓
勵效果。
> 而且 Node.js 與 React.js 的融入,都是促進 JeForth 熟化的必然要素
我心目中的這個 jeForth kernel 嚴守 kernel 的本分,不多做任何一丁點。也就
是把一切應用交給 user, 連 dup swap if else then 等都屬應用層面。也就是只
照顧 code end-code 以及少數必要的公用 functions (i.e. pop(), push(), last() 等) ,
properties (i.e. words[][], dictionary[], stack[], rstack[] 等) 此外無他。
Node.js 是咱的 host 之一,本 kernel 企圖 porting 到所有的 JavaScript host 故必
須能支援,也已經可以支援。我還不知道 react.js,如果是應用層我不管,如果也
是個 JavaScript host 則同樣必須支援。
以上報告。
請上 GitHub > project-k 整包 zip 抓下來,直接在 local computer 執行 baby.html 欣
賞該 demo。查看 jeforth.js 看短短的程式架構、註解、變數取名、function 取名等
好不好懂,並請賜教。
[x] baby.html 中扯進 jquery 有違盡量簡單的目標。但是不用 jquery 則
$('#outputbox').append(plain(ss));
改寫起來就會很麻煩。
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
[x] 錯了! kernel 怎知自己叫作 vm ??????? init() 要改。
> vm.init.toString()
'function () { \r\n\t\ttype = vm.type;\r\n\t}'
[x] baby.html [x] node.js [ ] bbt.html
==> 其實沒錯,因為 jeforth.js 裡面看到的 vm 就是自己。不是外面那個 vm instance.
[x] 準備回應爽哥要求 jeforth.html 改寫中,
[x] jsc 還有問題, drop it
[x] sample code baby.html , cub.html ... done
[x] cub.f 直接在 jeforth.3we 裡試驗 project-k-kernel 很成功。一下就把 cub.f
run 起來了。cub.f 沒有 selftest 所以不可靠, jeforth.3we 穩是基本要求。準備
改用 3we/kernel/jeforth.f
[x] 用了很久的 packhelp() 傳回 "( foo ) bar" 或者 "( ?? ) No help message. Use // to add one."
等於是從 tib 抽 help 出來。用新的 "parse-help" 取代,方法如下:
push(nexttoken('\n|\r')); // rest of the first line
execute("parse-help"); // ( "helpmsg" "rests" )
tib = pop() + " " + tib.slice(ntib); ntib = 0; // "rests" + tib(ntib)
newhelp = pop();
[x] project-k 的 panic 要表明身分,否則搞搞不清楚.
[x] 從 jeforth.3we 下命令給 project-k VM 用 hotkey f8:--> cub.f
[x] cub.f 好了,攻 selftest, 改良。
[x] Original (words) in jeforth.f is very powerful but without -v and -V.
While words and help was poor, because they were rely on voc.f unnecessarily.
So we need to improve words and help. --> 規定好 input 格式, 有助化簡程式。
words/help [pattern [switch [argument]]]
[x] 老經驗
nexttoken('\n|\r'); // if use only '\n' then we get an unexpected ending '\r'.
[x] see ~(create)~
JavaScript error on word ".0r" : Cannot read property 'length' of undefined
==> RI,FP: 產生一個 colon word 方法很多,不一定已經有 cfa。
[x] 用 vm.init() 來設定 type() or print() function 多此一舉。已經有 vm.clearScreen 等
乾脆就不要 init() 了。projct-k 根本不知道也不用知道你需要 print() !!
==> jeforth.js 有用到 type() 這樣一來 project-k 就認為自己在有 display 的地方執行?!
雖然可以從 type() 的定義解決,總是不太理想。
==> 用到 type() 的地方
1. docode() 的 reDef warning ==> 改 call panic(state-object).
2. panic() ==> 所有 error/warning 都 call panic() 如前。但 panic() 裡面先檢查有
沒有 vm.panic() 然後 call vm.panic(state)。
3. reset() 的 message 沒啥意義
==> 已經都用 k :: type=function..., k :: prompt=.. 的方式。
[x] Javascript 的 string 有 trim() method 可以去頭尾 white spaces, 從來不知。
But! project-k can't use string.trim(), Windows XP JScript does not support that.
String.replace(/(^( |\t)*)|(( |\t)*$)/mg,''); // remove 頭尾 whitespaces. .trim() 舊 JScript v5.6 未 support
[x] stackwas 放在 jeforth.js kernel 裏頭有必要嗎? --> 改成 tick(':').stackwas 了。
[x] 要參考 code word 自身,用 tick('name') 是可以考慮。有更好的辦法嗎?
==> 現在 _me 直接就是該 word object 本身。
[x] working on db bp *debug* for cub.f
==> resume function needs a static variable.
--> see processing.f, "JavaScript Module Pattern: In-Depth" in YouDao Notebook.
==> I only want to get the code word object in its xt(), it's the argument! So,
simply call w.xt(w) passes w over, this simple! This is done in the inner().
also "newxt=function(_me){..." in docode() of kernel jeforth.js.
==> 經由 "newxt=function(_me){..." in docode() of kernel jeforth.js, and
simply call w.xt(w) in the inner() loop, we have _me in any code word
that indicates the code word itself.
[x] root word-list 還是叫 'forth' 好了, 當初想的是讓 project-k 盡量中性,先有 root 然
後再加上 forth voc 等。但因為 kernel jeforth.f 本身不 support vocabulary, 故以上
已經落空,根本分不出 root 跟 forth 不如就用 forth。還是可以在 voc.f 進來了以後再
拆分 root 跟 forth。但這麼做有何意義? 既無意義就表示都是 forth 即可。
所以 forth 變成永遠都在的部分,不想讓 words help 太雜亂時,盡量用 only work.f,
only git.f 等來讓輸出清爽。故 words 的 -v -V -V- option 都不必了,好耶。
[x] should be moved to voc.f
source-code-header ( -- ) \ The source-code-file.f header macro
[x] cub.f 寫好了以後要併回 cub.html, project-k 保持單純。
[x] 大改寫,
[x] voc.f help calls (help) but origianl (help)/help 的 系統 help 要重新調配.
(help) 不該負責印系統 help --> (words) words , voc.f words help ok
o 所有 g.sth 改成 vm.g.sth
o fortheval --> dictate
o print --> type
o kvm --> vm
[x] jeforth.3we 的 'kernel' directory 直接就是 project-k 以免搞不清楚.
本來認為是 kernel 的 jeforth.f 跟 voc.f 則搬到 f 裡去。不當作 kernel 了。
[x] 這個要把 kernel 拿掉, 以 3htm 為例,
kvm.path = ["dummy","f", "3htm/f", "3htm/canvas", "3htm", "playground"];
[x] 這兩個不必佔用 vm.member , 應該直接放進 *debug* 的 members。
因為掛在 vm 下的 properties 都要有關聯 vm 內外的目的,如 vm.type(), vm.prompt,
等. bp 跟 continue 或 resume 純粹是 jeforth.f 內部的東西, 應該屬於 value 放
在 vm.g 下才對. 宣告成 value 就對了。
// debug
vm.bp = 0 // breakpoint <---- tick("*debug*").breakpoint=0
vm.continue = 0 // *debug* resume point <---- tick("*debug*").resume=null
[x] index.html [x] cub.html [ ] 3nw [ ] 3nd
[x] some application didn't use this trick
e = (e) ? e : event; var keycode = (e.keyCode) ? e.keyCode : (e.which) ? e.which : false;
[x] index.html of 3HTML, [x] baby.html of project-k, [x] cub.html of project-k
[x] chrome f12 跑出一個 message :
cub.html:6 Resource interpreted as Stylesheet but transferred with MIME type text/plain: "http://localhost:8888/common.css".
我不喜歡這個解釋 http://stackoverflow.com/questions/12003107/resource-interpreted-as-script-but-transferred-with-mime-type-text-plain-for-l
用 Win8 ie10 也一樣有問題 SEC7113: CSS was ignored due to mime type mismatch
--> utf-8 改成 ANSI 也沒用
==> 改直接執行 cub.html 就好了 (不透過 localhost:8888) --> 可能是 webserver.f 的問題.
==> 果然是 webserver.f 的問題! https://msdn.microsoft.com/en-us/library/hh180764(v=vs.85).aspx
RI : An imported style sheet was not used due to the wrong MIME type in the HTTP header.
FP : Ensure style sheet file is delivered with the proper HTTP response header, which includes
a content type of text\css. See MIME-Handling Changes in Internet Explorer for more information.
[x] ie10 還抓到 cub.html 好多別的問題
HTML1402: Character reference is missing an ending semicolon ";".
cub.html, line 243 character 22
HTML1402: Character reference is missing an ending semicolon ";".
cub.html, line 707 character 62
HTML1402: Character reference is missing an ending semicolon ";".
cub.html, line 707 character 124
HTML1402: Character reference is missing an ending semicolon ";".
cub.html, line 710 character 34
HTML1402: Character reference is missing an ending semicolon ";".
cub.html, line 712 character 103
在 chrome 都沒問題,而且所列之處根本就是 forth code ! 別管他。
[x] 3htm jsc 裡 erase 無效 ... 感謝我自己! 以前已經發現在 jsc console 時
inputbox.value 是 \10 因為 \r\n 只吃掉 \r 故留下 \n 使得 inputbox 非 empty 因此
{backspace} 不工作。修改判斷條件為 inputbox.value==""||inputbox.value=="\n" 即可
[x] tweak cub.html on going . . . so as to make a project-k release
[x] 12:18 2017-09-23 jeforth.js 改名為 projectk.js 因為 peforth 的 kernel 叫
projectk.py 如果叫 peforth.py 整個 project 就會到處都是 peforth.xxx 搞不清都是些啥。
[x] peforth 1.15 之後增加了 function cascading 的功能,應該要更擴大點,不限於
ok, dictate, push, execute 至少還有 tick 也要 <-- 錯,tick 本來就有 return 值。
[x] cascade 擴展到 project-k.js 版。奇怪,以前有改好過怎麼不見了?
--> 確定有
> <js> push(123).dictate(" dup + . ")</js>
246 OK
[ ] 整理 project-k 的 wiki. 特別是改名成 projectk.js 之後。而且還增加了 projectk.py
[ ] 把 project-k 的 jquery 拿掉不用,避免 rawgit 老是出問題。
目前 baby.html 經由 rawgit 執行時,要改成 https 才能 include 到 projectk.js. 而 sample.html
沒有出錯,但是半路就停住了。兩者用 local host 執行都沒問題。
[X] 2020/03/23 14:07:46 sample.html 在 2018.7.23 之後到今天之前都是 corrupted 一直都沒發現,今從 2018.7.20
舊版救回來,在 chrome 上一次 ok。
[X] 2020/03/23 16:08:42 發現 sample.html selftest 不過,因為缺 vm.greeting() 且 invisible 也沒寫好。
proeforth.html 弄好了,奇怪,以前是怎麼過的?
[ ] 10:53 2020/12/04 向爽哥介紹 project-k 馬上發現此前寫法不漂亮。
定義 dstack 就該把 push pop 包進去變成是它的 method
comma() here 是 dictionary 的 method and property
etc