587 :
567:2005/10/22(土) 22:47:31
>>586 ごめんなさい。私の頭の方が先に限界が来てしまいました。
>(nil true?)がまた評価されてしまうように感じるんだけど
いえ、( '(nil true?) list? ) の場合には true が帰ってきます
問題となるのは、式を末尾まで評価し終わったときに、( 〜 ) のような不安定なオブジェクトが残っている場合なんです。
だから、[ 〜 ] を用意したとしても、
>> ( [ + 1 2 ] head )
[+]
にしなきゃいけないはず……って、根本的な問題が何も解決されてないな orz
588 :
567:2005/10/22(土) 22:52:32
Vector には、評価済みの値のみ入れられるようにしよう。そうしよう。・゚・(ノД`)・゚・。
なんか567の言語だとS式は値になれない希ガス
590 :
573:2005/10/22(土) 23:16:57
>問題となるのは、式を末尾まで評価し終わったときに、( 〜 ) のような不安定なオブジェクトが残っている場合なんです。
別に残ってても何も問題ないような…?
例えば、
'(apple banana orange)
を評価したら
(apple banana orange)
というリストが返ってくるだけでいいと思う。それをまた評価しようと考えてるのかな?
Lispじゃ( 〜 )のようなデータは普通というか基本だし、さらに評価する必要なんかないと思う。
591 :
567:2005/10/22(土) 23:25:21
評価手順がゴミのようです。
>> ( 1 + 2 + 4 + 5 )
12
rcv: 1 prm: ( + 2 + 4 + 5 ) env: global
rcv: + prm: ( 2 + 4 + 5 ) env: 1
rcv: 3 prm: ( + 4 + 5 ) env: global
rcv: + prm: ( 4 + 5 ) env: 3
rcv: 7 prm: ( + 5 ) env: global
rcv: + prm: ( 5 ) env: 7
rcv: 12 prm: ( ) env: global
rcv: global ret: 12 : env: global
えっと、整理すると Quote が外れた後の不安定なオブジェクトが評価されてしまうのが問題なんだから、
不安定なオブジェクトでは、そもそも Quote が外れないようにすれば……。
592 :
573:2005/10/22(土) 23:35:40
>>591 えっと、そもそも不安定なオブジェクトって何なのかな?
リストとのことかと思ってたけど…
あと、評価規則だけど、
1.(整数など)アトムの評価結果はアトム自身
2.リストは'('から')'の間をメッセージ・センディングとして評価する
ってことでいい?
>1.(整数など)アトムの評価結果はアトム自身
はい。
例えば、安定なオブジェクトは
>> ((((((((((((1234))))))))))))
1234
みたいに変化しないオブジェクトです。
逆に、リストやシンボルは別な値へと変化しちゃうんで不安定。
>2.リストは'('から')'の間をメッセージ・センディングとして評価する
リストは評価すると、head 宛てに tail を送信します。
ちょっと思いついたかも。実験します。
【 quote 】
> ( 'true self ) ... 0ms
true
> ( 'true proto ) ... 0ms
root-symbol
> ( 'true quote? ) ... 0ms
nil
> ( ''true quote? ) ... 0ms
true
【 quote::quote内評価 】
> ( 'nil ) ... 0ms
nil
> ( 'nil self ) ... 0ms
nil
> ( 'object ) ... 0ms
object
> ( '( object true? ) ) ... 0ms
(object true?)
> ( '( object true? ) self ) ... 0ms
(object true?)
> ( '( object ) quote? ) ... 0ms
nil
> ( '( object ) list? ) ... 0ms
true
……うまくいったです。
( '(object true?) self ) が (object true?) を返してますけど、これは許してください。
もう1つだけアンケートさせてください。
『全てのオブジェクトの継承元である object にブール演算・条件演算を適用させたいかどうか』
適用させた場合、ちょうど Io と同じような構造になります。
また見た目を考えた場合、true と表示されるオブジェクトを作るかどうかも考えています。
適用させない場合、ブール演算や条件判断演算は、object に対しては行えません。
Smalltalk を初めとした諸言語と同じ構造になります。
Io って知らないんで全く外しているかもしれないが、
nil だとか 0 だとか false だとか(ものによってそれぞれだが)以外は
真になるってことなら一般的だと思うけど。
うひ。外見的には C と C# の違いです。
if (1) { /* これが C */ }
if (true) { /* これが C# */ }
ちなみに、Io では object は基本的には真で、唯一の例外として nil のみ偽です。
object にブール演算適用できるようにしても、true の件はどうしましょうか。
true スロットに object 入れておけば true として使えるんでスが表示は object になってしまうんで、
独自に true オブジェクトを作って表示も true にしたほうが良いかどうか。
ミスを防ぎたいならC#方式。
タイプ量を減らしたいならC方式。
オレの好みはC#方式。
タイプ量は「!= 0」をワンキーで入れるようにエディタを仕込めばいいから。
スロット A があったとき、A には 「true」 「nil」 「それ以外」 が入っている可能性があります。
これをどう見るかも、また問題かも。
ある意味で C 方式の方がミスが少なくなるかも。かも。
偽となる特定の値以外は真になってる方がいいよ。使いやすくて。
まあどうせ俺が使うことにはならないだろうからどうでもいいんだが。
またまた御力を頂きたい (;´∀`)
シンボルの評価には、幾つかパターンがあります。
( hoge ) # hoge スロットから取り出す
( hoge? ) # 末尾が ? のシンボルは、スロットが見つからない場合 nil を返す
( hoge: 0) # 末尾が : のシンボルは、スロットが見つからない場合、値を hoge スロットに代入する
( super hoge ) # proto の hoge を取り出す
( static hoge ) # proto を辿らずに hoge を取り出す
んで、スロットの値を "評価せずに" 取り出すのは、どっちが良いでしょうか
> ( hoge: (method (x) (x + 1)))
> ( hoge 2 ) # これだと普通にメソッドを評価
3
> ( get hoge ) # 選択肢その1、get に続いてスロット名
#(method (x) (x + 1))
> ( hoge@ ) # 選択肢その2、シンボルの末尾を ^ や @ などの特殊文字に
#(method (x) (x + 1))
俺はその2がいいな
じゃあ私はその1
されば俺はその3案を
606 :
602:2005/11/04(金) 07:50:28
わかった
> ( 'hoge get ) # 選択肢その3、hoge を quote で囲み、get を送信
#(method (x) (x + 1))
よく分かってないけど、
hoge とだけ書いたら hoge の値が取れるってのはどう?
(hoge 2) は、hoge が評価されて
((method (x) (x + 1)) 2)
になってから値を求めるとか。
>>607 ごめん。そいつは評価システムを根本から変えなきゃいけないから無理 (-∀-;)
申し訳ない……。
っていうか、ココ本当に俺しか居ないなぁ。
【今日の質問】
メソッドオブジェクトをスロットに保存しようとしても、取り出し時にメソッドが評価されてしまう
このように、メソッドを評価したくて代入したのか保存したくて代入したのかが現時点では区別されて無い
どうすれば良いか
【俺の案その1】
スロットテーブルを2個つくり、代入シンボルを変える
値を入れるときには hoge: で、メソッドを実行可能状態でセットするときには hoge! とか。
【俺の案その2】
スロットに代入後、スロットの属性を変更する。
set-mode hoge "-rwxrwxrwx" とか。
【俺の案その3】
気にしない。オブジェクトを評価せずに取り出す機構は別に用意してある。
実装の難しさは2、1、3の順で簡単になる。
案2は使用時に面倒だけど、読み取り属性とかも一緒に設定できて小回りが効く。
どれがいいでしょうか。
俺は1がいいと思う
>>609 呼び出し時の構文で、メソッドを評価するかどうか
変えるのが好み。
例えば、
1.aVariable = slot_name; // メソッドが取り出される。
2.aVariable = slot_name(); // メソッドを取り出し実行する。
ごめん。『案その1』 で実装したんだが、何故だか妙に使いにくい。
『案その3』 で行くことにするよ。
常々思うんだけど、マニュアル書くの面倒だね。
書き終わったら暫定ながら公開してみます。
自分で納得できるものが出来たです。
田中彰の応援歌を考えた。
行くぞ彰ホームラン!センターオーバーホームラン!
弾丸ライナーだ!飛ばせ!運べ!彰!
俺が考えた歌詞ですよ!
弾丸ライナーだ!の後に「ヘイ!」とか「おい!」って掛け声を入れてスタンドでジャンプするの
とかいれると面白いかもしれない。
615 :
デフォルトの名無しさん:2006/02/16(木) 22:48:20
がんヴぁ
616 :
デフォルトの名無しさん:2006/02/16(木) 22:50:09
sage
sage
620 :
デフォルトの名無しさん:2006/02/17(金) 10:30:32
出来た?
621 :
デフォルトの名無しさん:2006/02/21(火) 00:56:08
頓挫したよ
622 :
デフォルトの名無しさん:2006/02/21(火) 01:20:01
Fortranのように直感的な書式で数式が書け、
Java程度にはオブジェクト指向で、
複素数、ベクトル、行列、テンソルクラスがデフォでついてて、
ついでにそいつ等の演算がblas、lapack並のポフォーマンスでできて、
C++のように目を回すほど複雑でない
科学技術計算向けの言語を作ってくれるツワモノのいないでしょうか。
グリーンジャンボがあたったら援助は惜しみません。
623 :
デフォルトの名無しさん:2006/02/21(火) 01:21:10
ポフォーマンスorz
>>622 それをソースにするとどんなかんじになる?
普通にc++ライブラリを作ればいいじゃないかと子一時間
綺麗好きが多いんだろ。
表記法に特化した言語を作るのは簡単だが
あとあと、計算結果をグラフにしたり、文字で出したりする時にどんどん必要なものが増えてくるんだよ
だから、すでにある言語にインプリメントしていったほうが結果的には奇麗になる
629 :
デフォルトの名無しさん:2006/02/21(火) 13:40:39
トップダウンかボトムアップか
630 :
デフォルトの名無しさん:2006/02/21(火) 19:19:50
631 :
デフォルトの名無しさん:2006/02/21(火) 22:41:37
Javaで演算子オーバーロードできればかなりうれしい。
632 :
デフォルトの名無しさん:2006/02/21(火) 23:00:25
すまんが、lisp系は萌えない
633 :
デフォルトの名無しさん:2006/02/21(火) 23:03:29
>>631 普通に構文解析パーサをクラスに持たせりゃいいじゃん
class.Compute("(a + b) * (a - b)");
class.Set("a",1);
class.Set("a",2);
value = class.Value();
みたいな〜
Javaのプリプロセッサで演算塩ーバーロードとかありそう