すたんだーどっ☆あいおーっ!

Flashノベルエンジン実験 2008/11/08
余計なコマンド減らして難しいことは出来ないようにした。
シナリオファイル
頭のロゴ〜タイトル〜ゲーム中まで全部この中に描いてあります。 TIPS以外

2010-03-27

こんなのがコンパイラを通るんだね

コンパイラインタプリタの差がよく分からない。

だとして、例えばソースを一度全部眺めて関数定義を全部メモしておくけど、コードの実行は一行ずつ読む。なんて場合は何というのだろうか?

C言語は呼び出される関数が呼び出しよりも先に定義(宣言でもいいが)されてないと動かないように、インタプリタもまだ読んでいない部分に関数が宣言されていたとしても、読むまでは分からない。これじゃ不便なので関数定義だけは先にざっと探してメモしておく俺言語を作ってみたいのだが、これはコンパイラなんだろか。

//ActionScript風インタプリタだと思って下さい。
var num:int 10;

//上から一行ずつ読んでいる場合
//この時点ではまだ関数add10が何者か分からない。
num = add10(num);//エラー。そんな関数ないよ!
function add10(n:int):int{
	return n + 10;
}

まぁそんなことはどうでも良い。俺様言語VirtualMachineとしてしまえばどっちでも通りそうだからこの話はキニシナイでおこう。

当たり前なのかもしれないけど、今日、こんなコードがAS3で通る事を知りました。

var num:int = 0;
var abc:int = 0;
abc = 1 + (num = 1 + 2);

//abc = 1 + num = 1 + 2;//ちなみにこっちは通らない。

trace("num:" + num + " abc:" + abc);//num:3 abc:4

//なんもしない式たち。でもコンパイラは通る。
10;
num;
(1);
(abc);

C言語でも通る。()の中身は別の式として処理しているからなんだろか。

確かに自分でスクリプト言語作っていくとこれが問題ない式だと思えるところが何とも不思議だけど、

言語処理の勉強でこういうところに気がついて行けるのはとても楽しいね。

2010-03-26

気が付いたら1ヶ月も経っていやがる。

お勉強中。

とりあえず

という順序で勉強するべきなのだろうと思います。

AS3のArrayクラスは配列としてもQueueとしてもStack的にも使えるので便利だと思うのですが、あえて言うならpeekが欲しい。

var stack:Array = new Array();

//こうするの面倒くさい。
stack[stack.length - 1];

//これが欲しい
stack.peek();

拡張すんのなんか嫌だなぁ。

なんてクラスにするのさ。

2010-02-26

本格的に作るのは難しい

本格的にスクリプトエンジンを組もうとすると再帰下降構文解析やらEBNFやらを覚える必要があるみたい。

ネガティブな話だけどいきなりそういうのは無理っぽいので、もっと単純に考えようと思う。

簡単でグラフィカルに動けばいいという方針で。

2010-02-25

放置中だったけど

再開しようと思う。

アウトプットは必要だと思ったので。

技術レベルが低くてもキニシナイ!

2009-02-22

C++ 配列 長さ 取得

これでググっても案外出てこない。

C++でこんな風に書きたいと思ってるんだろうけど不思議なもんで出てこない。

int[] ary = new int[10];
system.out.println(ary.length);//10

あいかわらずmelponさんのパクりだけど書いてみよう。

#include <iostream>

//配列クラス
//ary[index]で要素アクセス出来て
//ary.lengthで長さが取得できればいい
template<class T>
class Array{
private:
	T*		m_pAry;
public:
	const int length;
	Array(int len):length(len),m_pAry(new T[len]){
		
	}

	~Array(void){
		if(m_pAry)delete[] m_pAry;
	}

	T& operator[](int idx){
		return m_pAry[idx];
	}
};


int main(void){
	//======================================
	//静的確保
	Array<int> ar(7);
	ar[0] = 5;
	
	//要素アクセスと長さの取得
	std::cout << ar[0] << std::endl;
	std::cout << ar.length << std::endl;

	//======================================
	//動的確保
	Array<int>* ar1 = new Array<int>(10);
	(*ar1)[0] = 5;
	
	//要素アクセスと長さの取得
	std::cout << (*ar1)[0] << std::endl;
	std::cout << (*ar1).length << std::endl;

	//======================================
	//char*だってはいるよー
	Array<char*>* ar2 = new Array<char*>(3);
	(*ar2)[0] = "test";
	
	//要素アクセスと長さの取得
	std::cout << (*ar2)[0] << std::endl;
	std::cout << (*ar2).length << std::endl;

	std::cout << "hello" << std::endl;
	char c;
	std::cin >> c;
	return 0;
};

動的な時が(*ar)[idx]ってなるから格好悪いね。