info

ANTLR、とりあえずS式がパースできるようになった

あとはアクションを書く
シンボルの定義が予想以上に文字を食うのでそこらへんに手まどった。
C言語APiとか、ANTLR_VECTOR構造体のメンバがわからなかったけど公式ページにドキュメントがあってよかった。

toplevel : s_expr*
	;
	
s_expr  : atom
	| list
	| '\'' s_expr
	;
	
	
list	: '(' (s_expr+  ('.' s_expr )? )?')'
	;

atom 	: SYMBOL
	| INTLITERAL
	;

SYMBOL  
	: SYMBOLNONUM ('0'..'9' | SYMBOLNONUM)*
	;

fragment
SYMBOLNONUM 
	: ~('0'..'9' |'(' | ')' | '\\'|'\"' | '\'' | '.' | ' ' | '\r' | '\n' | ';')
	;

INTLITERAL :	'0'..'9'+
    ;

COMMENT
    :   ';' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    ;


WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

Rubyのメモ化をメタプログラミングを使わずにやる

一度は諦めたこの方法でできた

def memoize(f)
  dp =  {}
  lambda {|*arg| dp[arg] ||  dp[arg] = f.call(*arg)}
end

def ack(m, n)
  if m == 0 then
    n + 1
  elsif n == 0 then
    ack(m - 1, 1)
  else
    ack(m - 1, ack(m, n - 1))
  end
end

ack = memoize(lambda{|*arg| ack(*arg)})

ack.call(3, 9)
=> 4093

lambdaで包めばよいのだ!

Arduino買った

LEDピカピカさせた。タクトスイッチをつけて、スイッチを押すたびにLEDのON/OFFが切りかわるやつやった。

リアルタイムプログラムの処理はゲームと似た感じだ、1.処理して 2.表示する

#define LED 13

#define BUTTON 7

//LEDやタクトスイッチが繋がれてるポートを指定
void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT);
}

void loop()
{
//1.処理して
 static bool isFlash = false;
 static bool old = false;
 bool isPush = digitalRead(BUTTON);
 
//ボタンが押されている間何ループもするので押されつづけていることを調べる
//ボタンが押されている、かつ前のloopでボタンが押されていなかったならば、LEDのON/OFFを反転させる。
 if(isPush && !old)
 {
   isFlash = !isFlash;
   delay(100);
 }
   old = isPush;
   
//2.表示する
  isFlash ? digitalWrite(LED, HIGH) : digitalWrite(LED, LOW);
}

RCAのコンポジットの黄色の端子につなげて、LispインタプリタをレトロPCみたいにして楽しみたい、色つきの線を書きたい、ファミコンみたいにチップごとに表示させたい。
RGBをPWM、同期信号をデジタルポートに出して、オペアンプでごにょごにょすればいいらしい・・・・・・
http://picavr.uunyan.com/avr_m_component.html
ここじゃコンポーネントだけど、混ぜるのもオペアンプ使うのかな?

2Dゲーム用の重力計算モジュール作った、google test試しに使ってみた

moveable.hh

#include <cmath>

#ifndef _MOVEABLE_H_
#define _MOVEABLE_H_


namespace moveable
{
	//いろいろな定数値、後でcommon.hに入れてもらう
	const float PI = static_cast<float>(atan(1.0) * 4);
	const float RAD = PI / 180;//HACK 30度 = 1/6ラジアン

	const float LEFT_HORIZON_ANGLE = PI;
	const float RIGHT_HORIZON_ANGLE = 0.0;
	const float RIGHT_JUMP_ANGLE = -((2/6) * PI);
	const float LEFT_JUMP_ANGLE = -((4/6) * PI);
	const float VERTICAL_JUMP_ANGLE = -((3/6) * PI);

	const float GLOBAL_INIT_GRAVITY = 2.0;


	//座標を表わすクラス
	class point
	{	
	public:
		float _x;
		float _y;

		point(): _x(0.0), _y(0.0) {}
		virtual ~point(){}

		inline point operator + (point &other)
		{
			point result;
			result._x = this->_x + other._x;
			result._y = this->_y + other._y;
			return result;
		}
	};


	//座標を動かしたいクラスにこれを継承させ仮想関数を定義させる、下のコンポジションさせたクラスが値を取得するために必要
	class moveable_mixin	{
	public:
		virtual void set_point(point) = 0;
		virtual point get_point() = 0;
		virtual bool is_ground_stick() = 0;
	};


	//座標を動かしたいクラスにコンポジションさせる
	//コンストラクタにMoveableMixinを継承させたクラスのthisポインタを入れること
	//加速度(set_acceleration)などを設定した後、座標と速度を更新するためにmoveメソッドを最後に呼ぶ
	class moveable
	{
	public:
		moveable(moveable_mixin *p) : _parent(p), _acceleration(), _velocity(), _gravity(GLOBAL_INIT_GRAVITY){}
		virtual ~moveable(){}
		
		void force_stop();
		void move();
		void add_acceleration(float acceleration, float angle);
		void set_const_velocity(float speed, float angle);
		void set_gravity(float g);


	private:
		moveable_mixin *_parent; 
		point _acceleration;
		point _velocity;
		float _gravity;
	};
}

#endif /*_MOVEABLE_H_*/

moveable.cc

#include "moveable.hh"

namespace moveable {

	//加速度と速度をゼロにして、動きを止める
	void moveable::force_stop()
	{
		_velocity._x = 0.0;
		_velocity._y = 0.0;
		_acceleration._x = 0.0;
		_acceleration._y = 0.0;
	}

	//加速度を速度に足し、速度を座標に足して動かす、重力がはたらいているならば考慮し、計算する
	void moveable::move()
	{
		_velocity._x += _acceleration._x;
		_velocity._y = (_parent->is_ground_stick() ? 0.0f : _velocity._y + _acceleration._y + _gravity);
		_parent->set_point(_parent->get_point() + _velocity);
	}

	//加速度と角度をもらって加速度ベクトルを表わす極座標に足す
	void moveable::add_acceleration(float acceleration, float angle)
	{
		this->_acceleration._x += acceleration * cos(angle);
		this->_acceleration._y += acceleration * sin(angle);
	}

	//加速度をゼロにして、速度のみをセットする、速度と角度をもらって速度ベクトルを表わす極座標に足す
	void moveable::set_const_velocity(float velocity, float angle)
	{
		force_stop();
		this->_velocity._x = velocity * cos(angle);
		this->_velocity._y = velocity * sin(angle);
	}

	//重力をセットする
	void moveable::set_gravity(float g)
	{
		_gravity = g;
	}
}

test.cc

#include <gtest/gtest.h>
#include "moveable.hh"


//test用ドライバークラス
class obj :public moveable::moveable_mixin
{
public:
	obj() {
		_moveable = new moveable::moveable(this);
	}
	virtual ~obj(){}

	moveable::point get_point()
	{
		return point;
	}
	void set_point(moveable::point p)
	{
		point = p;
	}

	bool is_ground_stick()
	{
		return ground_stick;
	}

	bool ground_stick;
	moveable::point point;
	moveable::moveable *_moveable;	
};

TEST(MoveableTest, Assert)
{
	obj testobj;
	
	//addAccelerationでの移動距離が合っているか、加速度がはたらくか
	testobj.ground_stick = false;
	testobj._moveable->set_gravity(0.0);
	testobj._moveable->add_acceleration(sqrt(8.0f),(moveable::PI / -4));
	testobj._moveable->move();

	EXPECT_FLOAT_EQ(testobj.get_point()._x, 2.0f);
	EXPECT_FLOAT_EQ(testobj.get_point()._y, -2.0f);

	testobj._moveable->move();

	EXPECT_FLOAT_EQ(testobj.get_point()._x, 6.0f);
	EXPECT_FLOAT_EQ(testobj.get_point()._y, -6.0f);


	//地面より下に落さないための処理がはたらくか
	testobj.point._x = 0;
	testobj.point._y = 0;
	testobj._moveable->force_stop();

	testobj.ground_stick = true;
	testobj._moveable->set_gravity(moveable::GLOBAL_INIT_GRAVITY);
	testobj._moveable->add_acceleration(sqrt(2.0f),(moveable::PI / -4));
	testobj._moveable->move();

	EXPECT_FLOAT_EQ(testobj.get_point()._x, 1.0f);
	EXPECT_FLOAT_EQ(testobj.get_point()._y, 0.0f);


	//setconstVelocityでの移動距離が合っているか
	testobj.point._x = 0;
	testobj.point._y = 0;
	testobj.ground_stick = false;
	testobj._moveable->set_gravity(0.0);

	testobj._moveable->set_const_velocity(sqrt(2.0f),(moveable::PI / -4));
	testobj._moveable->move();

	EXPECT_FLOAT_EQ(testobj.get_point()._x, 1.0f);
	EXPECT_FLOAT_EQ(testobj.get_point()._y, -1.0f);

	testobj._moveable->move();

	EXPECT_FLOAT_EQ(testobj.get_point()._x, 2.0f);
	EXPECT_FLOAT_EQ(testobj.get_point()._y, -2.0f);


	//重力がはたらくか
	testobj.point._x = 0;
	testobj.point._y = 0;
	testobj._moveable->force_stop();

	testobj.ground_stick = false;
	testobj._moveable->set_gravity(moveable::GLOBAL_INIT_GRAVITY);
	testobj._moveable->add_acceleration(sqrt(8.0f),(moveable::PI / -4));
	testobj._moveable->move();

	EXPECT_FLOAT_EQ(testobj.get_point()._x, 2.0f);
	EXPECT_NEAR(testobj.get_point()._y, 0, 1e-6f);
}

//int main(int argc, char **argv)
//{
//	testing::InitGoogleTest(&argc, argv);
//	RUN_ALL_TESTS();
//	return 0;
//}

アッカーマン関数+メモ化をいろいろな言語で

wikipediaから数式見て書いた
http://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%83%E3%82%AB%E3%83%BC%E3%83%9E%E3%83%B3%E9%96%A2%E6%95%B0

(ack 4 2)でメモリ1Gほど使ってアロケートエラー(スタックオーバーフローかもしれないけど、わからない)

(define (ack m n)
  (cond ((= m 0) (+ n 1))
        ((= n 0) (ack (- m 1) 1))
        (else (ack (- m 1) (ack m (- n 1))))))

 (define (memoize func)
  (let ((dp (make-hash-table 'equal?)))
    (lambda args
      (if (hash-table-exists? dp args)
          (hash-table-get dp args)
          (let ((value (apply func args)))
            (hash-table-put! dp args value)
            value)))))

(define ack (memoize ack))

gosh> (ack 3 9)
4093

gosh> (ack 4 1)
65533

gosh> (ack 4 2)
GC Warning: Out of Memory!  Returning NIL!
out of memory (16).  aborting...

ack(4, 1)で一瞬でスタックオーバーフロー、ふざくんなwwwwwwwwwww
スタックのサイズを弄るためにソースに手を入れる必要があるらしい

function ack(m, n)
   if m == 0 then
      return n + 1
   elseif n == 0 then
      return ack(m - 1, 1)
   else
      return ack(m - 1, ack(m, n - 1))
   end
end

--http://stackoverflow.com/questions/129877/how-do-i-write-a-generic-memoize-function     
function varg_tostring(...)
   local s = select(1, ...)
   for n = 2, select('#', ...) do
      s = s..","..select(n,...)
   end
   return s
end

function memoize(f)
   local cache = {}
   return function (...)
             local al = varg_tostring(...)
             if cache[al] then
                return cache[al]
             else
                local y = f(...)
                cache[al] = y
            return y
             end
          end
end

> print(ack(3, 9))
4093

> print(ack(4, 1))
stdin:4: stack overflow
stack traceback:
	stdin:4: in function 'ack'
	stdin:7: in function 'f'
	stdin:8: in function 'ack'
	stdin:7: in function 'f'
	stdin:8: in function 'ack'
	stdin:7: in function 'f'
	stdin:8: in function 'ack'
	stdin:7: in function 'f'
	stdin:8: in function 'ack'
	stdin:7: in function 'f'
	...
	stdin:7: in function 'f'
	stdin:8: in function 'ack'
	stdin:7: in function 'f'
	stdin:8: in function <stdin:3>
	(tail call): ?
	stdin:8: in function <stdin:3>
	(tail call): ?
	stdin:8: in function 'ack'
	stdin:1: in main chunk
	[C]: ?

メモ化で詰まった

? def memoize(f)
?   dp =  {}
?   lambda {|*arg| dp[arg] ||  dp[arg] = f.call(*arg)}
? end

Rubyの関数オブジェクトの実行は

func.call()

で呼ばないといけないので上の記述方法は使えない

メタプログラミング技法を使わないといけない、しかしこれもm.ack(4,1)でスタックオーバーフロー、Gaucheすごい

#http://www.geocities.jp/m_hiroi/light/abcruby11.html
class Memoize
  def initialize(name)
    @table = {}
    eval <<"DEF"
      def #{name}(*args)
        unless n = @table[args]
          n = super(*args)
          @table[args] = n
        end
        n
      end
DEF
  end
end

def ack(m, n)
  if m == 0 then
    n + 1
  elsif n == 0 then
    ack(m - 1, 1)
  else
    ack(m - 1, ack(m, n - 1))
  end
end

m = Memoize::new(:ack)

>> m.ack(3, 9)
=> 4093

?> m.ack(4,1)
SystemStackError: stack level too deep
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
... 7229 levels...
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):47:in `ack'
	from (eval):3:in `ack'
	from (irb):55

著作権とかにひっかかるかもしれないけど、適職診断サイトの結果貼ってみる

http://haa.athuman.com/personal_shindan/

パーソナリティ傾向

あなたは心の働きが強い部類に入る方です。心の働きが強いと以下に説明される傾向が表れやすく、他者への影響も大きい傾向があります。あなたのエゴグラムの特徴は、どの側面もほどほどの高さでバランスがとれているという事です。このパターンの人は、どのような人や状況にもうまく適応できる、安定した人柄と言えるでしょう。細かい特徴を見ていくと、客観的な側面が高い事から、冷静な思考力や判断力が備わっていて、的確に問題解決をする人だといえるでしょう。さらに、反抗的な側面も高い事から、自分の思いや欲求を貫くといったエネルギーを内在させていますが、これが反発心として表れ、我を強く通そうとすると、対人関係での問題となる事があるかもしれません。

適職傾向

あなたは好奇心が強く、創造的・直感的に物事に取り組むという側面に秀でています。これらの良い面を発揮するには、文化・芸術などを対象としたり、新しい物を創造したりといった職業フィールドが適しています。なぜなら、あなたは型にはめられない自由な活動を好み、独創的な個性・方法・様式を考えだす事に喜びを感じるような傾向があるからです。例えば、デザイン・イラスト関係の職業、美術・工芸・音楽関係の職業、文芸関係の職業などで、その力を十分に発揮するでしょう。反面、あなたは衝動的で、他者と協調したり、我慢して物事に取り組んだりという側面が課題となるようです。これらの面が表れると、定まった規則・習慣に従って行動するといった職業フィールドには適さないようです。例えば、経理事務関係の職業、法務関係の職業などでは退屈さや居心地の悪さを感じるかもしれません。しかし、もしあなたがこの職業フィールドに興味があるならば、自分の欲求・感覚・感情を抑え、状況に則した形で思考・判断をする力をやしなう癖をつけるとよいでしょう。

エゴグラムのグラフは大人系(XP)と(A)が同じくらい低くて子供系(XC)がMAX近かった、なんという20歳児

http://www.haken.co.jp/haken/result.asp

90題へのご回答誠にお疲れさまでございました。
あなたがご回答なさった際に強く顕れた一面は・・・

『夢見る』『考える』『忠実な』

気質です。

良い精神状態の時

心温かい・思いやりがある・表現力が豊か・独創的
分析的・粘り強い・賢明・客観的・洞察力がある
忠実・心温かい・情け深い・機知に富む・親身になる
悪い精神状態の時

意気消沈する・自意識過剰・片意地・気まぐれ
意固地・よそよそしい・あら探し好き・内気・消極的
用心深い・被害妄想的・自己防衛過剰・怒りっぽい
性格

豊かな感性を持つ芸術家タイプ。音楽や芸術を愛し、エスプリに富んでいる。深い情愛で他人と接し、心温まる関係をつくることができる。
コツコツと調べるのが好きな研究者タイプ。鋭い洞察力と深い理解力がある。富や地位に執着せず、人生の意義深さもよく理解している。
規則やルールを重んじる安全追求タイプ。誠実で仲間を大切にし、他人に対する思いやりが深い。組織の中でうまく協調していく融通性がある。
注意

自分が周囲に理解されないと、自分を悲劇の主人公に仕立てて無気力で退廃的になり、殻に閉じこもってしまう場合もある。
物事を頭の中でのみ考え、行動力がない。人と協調することが苦手で、他人に対して挑発的、敵対的になることもある。
集団への依存心が強く、マニュアルがないと不安を感じ、敷かれたレールから外れることを恐る。些細な決断にも必要以上に優柔不断になることが多い。
仕事

自分の独創的な探求を支えるために、芸術や言語を手段とする音楽家、小説家、ジャーナリストなどの仕事に向いています。
優れた分析能力を発揮する仕事、科学や技術研究者、単独で仕事をする自営業などに向いています。
チームの一員となることを好むため、公務員や企業社会、自衛隊などの仕事に向いています。
いかがでしたか?
己を知ることが、困難に立ち向かい、道を切り開くための第一歩とも申します。
この結果は必ずしもあなたのすべてではございませんが、あなた自身がお選びになった一つの方向でもあります。

これを機に、少々違う世界を覗いてみてはいかがでしょうか・・・。

ふうん、私は何も思いませんでした まる

luaによる関数型風プログラミング

いろいろ再帰

function fact (x)
	if x == 1 then
		return 1
	end
	return x * fact(x - 1)
end

function triangle(x)
	if x == 0 then
		return 0
	end
	return x + triangle(x - 1)
end


function fib (x)
	if x < 2 then
		return x
	end
	return fib(x - 1) + fib(x - 2)
end

print(fact(10))
print(triangle(10))
print(fib(31))

アキュームレータージェネレーター

function acc (n)
	return function (i) n = n + i; return n; end
end

foo = acc(5)

print(foo(2))
print(foo(6))
print(foo(5))
print(foo(1))

メモ化関数と、たらいまわし

function tak(x, y, z)
	if x <= y then
		return z
	else
		return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))
	end
end


function tarai(x, y, z)
	if x <= y then
		return y
	else
		return tarai(tarai(x - 1, y, z), tarai(y - 1, z, x), tarai(z - 1, x, y))
	end
end

--http://stackoverflow.com/questions/129877/how-do-i-write-a-generic-memoize-function
function varg_tostring(...)
    local s = select(1, ...)
    for n = 2, select('#', ...) do
        s = s..","..select(n,...)
    end
    return s
end

function memoize(f)
    local cache = {}
    return function (...)
        local al = varg_tostring(...)
        if cache[al] then
            return cache[al]
        else
            local y = f(...)
            cache[al] = y
            return y
        end
    end
end





print(tak(18, 9, 0))
print(tarai(12, 6, 0))

tak = memoize(tak)
print(tak(192,96,0))
tarai = memoize(tarai)
print(tarai(192,96,0))

fizzbuzz

require "std"

--http://lua-users.org/wiki/RangeIterator
function range(a, b, step)
  if not b then
    b = a
    a = 1
  end
  step = step or 1
  local f =
    step > 0 and
      function(_, lastvalue)
        local nextvalue = lastvalue + step
        if nextvalue <= b then return nextvalue end
      end or
    step < 0 and
      function(_, lastvalue)
        local nextvalue = lastvalue + step
        if nextvalue >= b then return nextvalue end
      end or
      function(_, lastvalue) return lastvalue end
  return f, nil, a - step
end

print(map(function (x)
	if x % 15 == 0 then
		return "fizzbuzz"
	elseif x % 5 == 0 then
		return "buzz"
	elseif x % 3 == 0 then
		return "fizz"
	else
		return x
	end
end, range, 1, 100, 1))