diff Idea @ 655:cddab906095e

struct init in function arg (or other expression).
author kono
date Sun, 14 Jan 2007 20:30:31 +0900
parents fd2dfa1fa627
children f536897fa3cb
line wrap: on
line diff
--- a/Idea	Sun Nov 26 21:54:03 2006 +0900
+++ b/Idea	Sun Jan 14 20:30:31 2007 +0900
@@ -1962,6 +1962,7 @@
 どうせ、だめではあるんだが。引数の型は一段階までしか、
 チェックしないので、だめだね。
 
+
 このあたり、理論的な問題があるみたいだな。
 
     stack を含めた有限な型付け
@@ -1972,3 +1973,102 @@
 そうか、parallel assignment では、同じ部分を前もって探した
 方が効率がよいわけか。(どうせ、やっていることだが)
 
+Sun Nov 26 23:22:12 JST 2006
+
+fp のsave は必要。何故かと言うと、
+    goto f(a,b,...)
+で、後ろの部分がどれだけあるかは、間接的な引数での
+宣言ではわからないから。
+
+stack 上に全部 interface があるなら、良いが、
+部分は register に乗っている。
+
+    goto f(a,b,c,...)
+
+としたときに、... の一部はregisterに乗っている。どれだけ
+乗っているのかを知る必要があるが、それをfpから推察する
+ことはできない。浮動小数点とかの異なる型が散在している
+から。
+
+... で引き渡す引数は、メモリに乗っている必要がある。
+型が明解なら、レジスタ上でもだいじょぶなはずだが。
+
+明示的な引数に大域的には変換できるはずだけど、open 
+な環境では、それはできない。
+
+だとすれば、
+    __code f(int a, int b : int h, ...) {
+       ...
+	goto g(a,b,c : d,e,f,...)
+    }
+みたいな形で、stack 上に乗せる引数を明示する必要がある。
+
+これは、なんなの?
+
+    : の前の引数は可変に出来ない
+    : の後までは可変に出来る
+
+っていうことか。
+
+構造体は、メモリ上に取るとしても..
+
+まぁ、...   のところまでレジスタで、それ以降は、メモリでも
+十分だけどね。いずれにせよ、複雑すぎることは確か。
+
+      __code g(int c,__code (*n)(int a,int b,int d,...),...) {
+	goto n(int d,int e,int c,...);
+      }
+
+で、この... は、すべて、同じものに置き換わるはず。 ... が
+入る場合もあるが。
+
+受け側が
+	__code c(int d,int e,int c,int k,int j) {}
+で定義されているときに、k,j がレジスタに乗っているかも知れず、
+乗っていたらダメダメ。なので、可変になる部分を明示する必要がある。
+
+Mon Nov 27 11:17:39 JST 2006
+
+結局、このn の定義と、実際のn の定義がずれることが問題なんだよね。
+	__code c(int d,int e,int c,...) {}
+で、受けることもあれば、
+	__code c(int d,int e,int c,int k,int j) {}
+で受けることもある。あるいは、
+	__code c(int d,int e,int c,int k,int j,...) {}
+とかも。
+
+implements というか、accetps というか、そんな形の別な
+宣言がいいのかな。
+    __code f(int a, int b : int h, ...) {
+でもいいんだが...
+
+Mon Nov 27 11:34:33 JST 2006
+
+      __code f(int a,int b,...) {
+	goto g(int c,__code *f,int a,int b,...);
+      }
+
+      __code g(int c,__code (*n)(...),...) {
+	goto n(...);
+      }
+
+
+g に入るときに、fp は、n の頭になければならない。これを
+移動するのは、f の役割。出て行くときには、b の頭に
+合わせる必要がある。これは、g の役割。g は、元の頭(fp)
+を知らないから、これは取っておく必要がある。差では
+判断できない。g 側で取っておくことは可能だが、その
+時にも、f 側からずらす大きさを渡す必要がある。
+
+明示しても良いんだけどね...
+	goto g(int c,__code *f,__environment,interface &rest),
+		__envronment+sizeof(interface);
+      __code g(int c,__code (*n)(...),(void*)parent,...) {
+	goto n(...),parent;
+      }
+みたいな形でさ... その方がいいのかな。繁雑だけど。: よりかまし?
+
+: を使う方法だと、: が fp みたいな感じになる。
+
+難しいね。きれいなsyntaxにならない。
+