2012年5月12日土曜日

こんなことをつらつらと考えてる


L^メモ
//#reserve on
//#hat off
using^OtherNamespace

// 果たして分割定義と新規定義を演算子で区別できる、
// と言うことのためにクラスが第一級オブジェクトである必要はあるか…?

$MyNamespace.IMyClass := interface^{
// シグネチャのみを指定
{
memberVirtual1 : p^x:int,y:int->int; // シグネチャ指定の場合は;必須
memberVirtual2 : p^x:p^x:int,y:int->int,string;,y:int->int; // メソッド変数の型指定
// (,は省略できなくていいかな)
memberVirtual3 : MyClassFoo.function; // 定義済み手続き・関数のシグネチャを採用する場合
memberVirtual4 : MyClassFoo.self^function; // 定義済みインスタンス手続き・関数のシグネチャを採用する場合
memberVirtualField : string;
}
staticVirtual : p^x:int,y:int->int,int; // 多返却の場合
// インターフェース定義のみ特殊。パラメータの型指定の構文と統一させるため
// := ではなく :
}

$MyNamespace.IMyClass := interface^{^
// インスタンスメンバのみなら、こう書ける。インターフェースだけでなくクラスも
}
// L^にstatic classは不要。C#などのは、メンバにstaticと修飾することで静的メンバを定義してるから必要なだけ

$MyNamespace.MyClass := Foo+IBar+IMyClass+class^{
// 基本クラスOtherNamespace.FooとインターフェースOtherNamespace.IFooとMyNamespace.IMyClass
// を継承している例。usingしているのでOtherNamespaceは省ける、MyNamespace.MyClassの定義中なので
// MyNamespaceも省ける
{^
// インスタンス定義
member := 0
funcMethod := f^x:string->int{(if^x!=0:int.Parse(x)else^member.ToString())}
method := p^x:string->int{
member = int.Parse(x)
return member
}
table := {^name="aaaa"} // テーブルリテラル内は変数定義ではないので、:=とは書けない、とする
}

// 型名の指定ではMyNamespace.MyClassがインスタンスの型。
// クラスを要求する場合はMyNamespace.MyClass.class^ ?
// classof^MyNamespace.MyClass ?
// class^MyNamespace.MyClassはカテゴリ名扱いになるから使えない

p^x{
// コンストラクタ
// f^でもよい(というかデフォルトコンストラクタは関数扱い)
// 何もしないなら省略できる。
// インスタンスがあるクラスかどうかは入れ子の{}の有無で区別
self.added := "コンストラクタでのメンバの追加はself.と明示"
// でないとこのプロシジャローカル変数とみなされるから
member = x
// コンストラクタ手続きではなく関数でも、メンバの追加や変更は許される(参照透過性を崩さないはず)
// もちろん、自分以外のオブジェクトの変更やプロシジャ呼び出しは禁止
}
// もちろん、コンストラクタ以外は無名は許されない

{^
// インスタンス定義の分割。
member2 := 0
// これ許すべきか。。。
// +=による分割定義許すんだから有りでしょう
}

static := "static field"

public^staticMethod := p^x{ return x+1 }
// = はオーバーライド
// := 新規定義
// += はオーバーロード
}

// グローバル変数宣言の場合$は省略できない。=なら$は省略できる
$MyNamespace.Bar += class^CategoryName
// partial class definition
}

/*
MyNamespace ?+= {^
  Foo := class^{
    // こういうネームスペースで囲む記法を用意する必要はないかも
    // $MyNamespace.FooでMyNamespaceがなかったら自動でnamespace作られる
    // だけで十分。?+=演算子(存在しなかったら新規、そうでなければ追加)
    // なんてもの用意しなくて済むし
  }
}
*/
// やるならこうか。名前空間は特別扱い(第一級でない)
namespace^MyNamespace.MyChildNamespace {
  Foo := class^{
  }
}

for^each^ k,v in^table.All() : name {
label^labelName
  while^true:name2 {
    {
      if^x<0{break^[name]} // 一番上を抜ける
    while^false:name3}
if^x==222 { goto labelName }
  }
}

for^i := 0 to^10 step^2 {
}

i := 30 // 上のiのスコープは終わってる
for^i = 0 to^10 step^1 {
// i=0->10
// 10を含む。iは10まで動く。ループを抜けた後は11になるべきか?
// 11になるのはBASIC的でない気がする
}
/*
for^i = Foo() to^Foo.EndValue {
// i = i + Foo.UnitValue()
// 実装が面倒そうfor to文は数値専用でいいかも
}
*/
for^i to^30 {
// i = 10 -> 30
// カウント変数明示でも擬似変数loopcounterは有効であるべきか?
// ユーザ定義を隠蔽してしまう可能性があるのだから、loopcounterは明示した場合存在しないべき
}

for^i+1 to^40 {
// i = 30
// loopcounter = 31 -> 40
// てっきりiが動くもんだと勘違いされそう…
// その意図だと、for^i=i+1 to^40 {} と書く必要がある…
}

for^1 to^10 step^2 {
print(loopcounter); // loopcounterは擬似変数。明示したい場合(ユーザー定義と名前がかぶった時)loopcounter^と指定。
// これを使うならカウンター変数を明示するfor to 文ははたして要るのか。。。
// ->要る。入れ子にするじゃん
// self this super など他の擬似変数の扱いは?
}

for^i := 1 while^i < 30 step^i + 1 {
// i = 1 -> 30
// step^はi = i + 1やi+=1とは書けない(制御文の中で極力代入文を書かせないため)
}
/*
for^i := 1, j := 3 while^i < 30 and^j < 3 step^i + 1, j + 1 {
// stepは i, j = i + 1, j + 1という扱い。
}
for^i := 1, j := 3 while^i < 30 and^j < 3 step^j + 1, i + 1 {
// stepは i, j = j + 1, i + 1という扱い。あくまで字面順。1ループごとに入れ替わってしまう
// やっぱりfor^i := 1, j := 3...とは書けないようにしよう
}
*/

for^i := 1 to^10 {
for^j := 1 while^j<20 {
if^xxxx{break[i]} // ループ変数を指定してのbreak。一番上のループを一気に抜ける
j = getnext(i, j)
}
}

/*
a := lazy^f^x:int{i+x}
b := lazy^FooFunction(1)
// 自動で遅延評価にならないなら参照透過性の意味が無いのでこれは不要
for^each^k,v in^table.Range(a, b) {
}
*/

// 擬似変数thisによる自己再帰
functorial := f^x{
(if^x==0: 1 else^ x*this(x-1))
}
// 関数ローカル変数への代入は許されるので(参照透過性を崩さない、ハズ)再帰で定義する必要はない
functorial = f^x{
return := 1
for^1 to^x { return = return * loopcounter }
return
}

// ラムダ式
for^each^k,v in^table.Where(k,v => k=="hoge") {
// ラムダ式の型は文脈で決まる必要がある、でいいかな。
// (k:???,v:??? =^ k=="hoge") とは書けない、で。
// 型指定したい場合はf^を使え、で。
// else^if^:のせいでf^p^で始まってないとid:typeidの構文を受け付けない、としないと解析が面倒
}
// for inはループ変数必ず新規定義、でいいかな

// 型キャスト
derrivedBar := Foo()
foobar := derrivedBar as^Bar
// 型キャスト、いるのかな?

// ヒアドキュメント
print(<
"ダブルクォーテーションはそのまま"EOS, i, param)

if^x<0{
print(y) // nilというか未定義
else^if^x == 0:
y := 1
print(y) // 当然1
else^
// ifが来た時だけ:要求で十分な気がする
print(y) // nilというか未定義
// if elseif else形式のぶら下がりifのない構文だと、実質if ~ else間でスコープ独立
// になる、でいいんだよね
}

// レキシカルスコープ
$a := 0 // グローバル変数
print(a) // 0
a := 1 // ファイルローカル
print(a) // 1
print($a) // 0
print($$a) // 1
print($1a) // 0
print($2a) // 1
print($0a) // 1
{
a := 2 // ブロックローカル
print(a) // 2
print($a) // 0
print($$a) // 1
print($$$a) // 2
print($1a) // 0
print($2a) // 1
print($3a) // 2
print($0a) // 2
print($-1a) // 1
print($-2a) // 0
{
a := 3
print(a) // 3
print($a) // 0
print($$a) // 1
print($$$a) // 2
print($$$$a) // 3
print($1a) // 0
print($2a) // 1
print($3a) // 2
print($4a) // 3
print($0a) // 3
print($-1a) // 2
print($-2a) // 1
print($-3a) // 0
}
/*
$
-2a
グローバル環境と、-2と変数a。文法エラー。
$-2a
空白文字無しでくっつけて書かないとスコープ指定子とみなされない
*/
}

2012年5月7日月曜日

Mac(Lion)のcmake使ってて、コマンドライン版がインストールできずいらっときていませんか?
俺は来ました。

sudo ln -s "/Applications/CMake 2.8-8.app/Contents/bin/ccmake" /usr/bin/ccmake
sudo ln -s "/Applications/CMake 2.8-8.app/Contents/bin/cmake" /usr/bin/cmake
sudo ln -s "/Applications/CMake 2.8-8.app/Contents/bin/cmake-gui" /usr/bin/cmake-gui
sudo ln -s "/Applications/CMake 2.8-8.app/Contents/bin/cmakexbuild" /usr/bin/cmakexbuild
sudo ln -s "/Applications/CMake 2.8-8.app/Contents/bin/cpack" /usr/bin/cpack
sudo ln -s "/Applications/CMake 2.8-8.app/Contents/bin/ctest" /usr/bin/ctest

ターミナルからこれやってやれば入ります。

sudo "/Applications/CMake 2.8-8.app/Contents/MacOS/Cmake 2.8-8"

で“Install Commandline tools”やってやると
ln -s [/Applications/CMake 2.8-8.app/Contents/bin/ccmake] [/usr/bin/ccmake]
てなコマンドでリンク作ろうとして失敗してるんだよね。なんだこれ?SQLじゃあるまいし…シェルでブレースで囲む記述は初めて見た。

2011年6月11日土曜日

Qtインストールメモ

もはや
http://www.ebatech.jp/archives/1533
ここで書かれているような面倒なことは一切無い。

ノキアのサイトからバイナリ版をそれぞれ落としてきてインストールするだけでいい。
が、ちょっとトラブルがあった。

Mac版の場合


ほんとになんにも苦労なし。ただ、最初Qt SDK for Mac を落としていれようとしたら、
不要なパッケージまでガンガンDL仕様とした挙句、途中でDLが全く進まなくなった罠はあった。
デスクトップ開発がしたいだけなら
Mac 版 Qt ライブラリ 4.7.3 のダウンロード

Mac 版 Qt Creator 2.2 のダウンロード(91MB)
だけで十分。

ライブラリはインストーラ付き、CreatorはアプリケーションフォルダにD&D。他に設定は要らない。


Windows版の場合


こっちはちょっとしたトラブルがあった。
Mac版での経験から迷わず
Windows 版 Qt ライブラリ 4.7.3 のダウンロード (VS 2008, 230 MB)

Windows 版 Qt Creator 2.2 のダウンロード(52MB)
インストール。2.2からはMinGW製バイナリでもVC製バイナリでもどっちでもデバッグできるとのことなので、実行速度で劣るMinGWには目もくれずにVC版をゲットしたが、Qt Creatorを立ち上げるとMac版ではサンプルプロジェクトを選べたドロップダウンメニューに「サンプルがインストールされていません」とだけ書かれててサンプルをサクっとビルド出来ない。
「ツール」→「オプション」から「Qt4」のタブを見ると自動検出には「PATHに含まれるQt<見つかりません>」となっていて、C:\Qt\4.7.3にインストールされているQtライブラリを認識出来ていないようだった。
下にマニュアル、と手動設定の項目があるのでバージョンに4.7.3、qmakeの場所はファイルピッカーからc:\qt\4.7.3\bin\qmake.exeを指定してやって無事解決。「ようこそ」画面に戻るとちゃんとサンプルプロジェクトのドロップダウンメニューも機能するようになっていた。
qmakeを指定しろ、というから“C:\Qt\4.7.3\qmake\qmake.exe”を指定してやったら正しくインストールされていませんみたいなことを言いやがるので、一旦アンインストールしてから再インストールまでやってしまったが、正解は上記のとおりbin\qmake.exeの方を指定する、だった。
紛らわしいから複数の場所にqmake.exe置かんでくれ。


なんだろう、本来ライブラリのインストール時PATHにqmakeへのパス通す事になってるんだけど、4.7.3のインストーラがそれをやらなくなってしまっている、ということなのだろうか