gs

関数パターンマッチングのまとめ

gs

オブジェクトリテラルも使えるようになって、もう大きな変化も無さそうなのでまとめます。 基本 シンボルはそのままローカル変数になります。 `x[ x ].(1) //1引数の数が合わなければエラーになります。 `x[ x ].() //error仮引数を書かなければ、引数ゼロを…

Object Invocation

gs

シンボルに続いて()があるか無いかと、そのシンボルが指すものがMethodかどうかで、インタプリタの解釈が少し変わります。 Method 非Method x x() x x() x() x.invoke() Methodの場合は同じですが、非Methodの場合は、()があればinvokeが呼ばれ、無ければそ…

ContainerのC++のSTLのalgorithm系メソッドについて

gs

func(begin, end, ...)は、func(self.begin, self.end, ...)となる 破壊的なものは!が後置、それの付かない版はコピーを返す ArrayやMapの値は置き換え(self.[index] = value)でなく書き換え(self.[index].= value)になる for_eachはeachがあるので無し。eac…

コンマとセミコロン

gs

また変に複雑化しました。セミコロンを式の省略可能なセパレータとすることで、&による括弧省略記法時に、どこまでを引数とする、というのを表現できるようにし、それならコンマも書きたければ書けるものにと、 コンマとセミコロンを、省略可能な、C系の言語…

高階関数の書き方 (invoke_in, invoke_from)

gs

C++側で書く場合は、どちらにしろContextオブジェクトをmethod invocationに渡すので、そのContextをcallerにすればいいだけだが、gsで高階関数を書く場合、これといって、このあたりのidiom的なものが無い。 というか、C++で書いてばかりで、gsで書くことが…

resolveとclosureのまとめ

gs

Giraffe+のScript\samples\resolve_and_closure.giraffeにテストとしてまとまってますが、resolve, resolve2, closure, closure2, closure3と十分ややこしくなってきてるので解説しておきます。LispやJavaScriptのようなクロージャはgiraffeにはありません。…

結局Context lookupはv0.5からv0.6でどう変わったのか

gs

0.6になって以降、少しずつ変更して来ましたが、さすがにもう変化は無さそうなのでまとめておきます。 invokeは同じなので解説しません。以下の説明はcallの場合(関数を名前で呼んだ場合)のみに有効です。 0.6でContextの継承が無くなりましたが、それではロ…

JSONもどき

gs

古い情報です。Giraffe+ 0.6.13.1042よりオブジェクトリテラルがサポートされてます。 配列とブロックがあって、ブロックが値の位置に現れた場合に、オブジェクトになるっていうJavaScriptの文法が重要です。 gsは配列とブロックの記号が入れ替わってますが…

GCとiterator

Giraffe+ 0.6.5.899で、 get-cb.filtered(`c[c.isalpha]).flushがaccess violation。 get-cbはクリップボードの文字列を返す。filteredはfilter_iteratorのRangeを返す。flushの時点で、get-cbが返したオブジェクトがGCに開放されてる可能性がある。実際には…

新しいsliceのまとめ

gs

従来の、selfと同じ型を返すslice([pos len])がslice_safe({pos len})になり、sliceはRangeを返すようになりました。 大きな配列や文字列を扱う場合にかなりの高速化とメモリ使用量抑制が期待できますが、注意点もあります。 Rangeに関する注意 sliceに限ら…

String Call

gs

ver0.6.2より、文字列リテラルをシンボルとして扱えるようになりました。 "abc": 0 -> def("abc" 0) "abc"() -> call("abc") "!#{cmd}"() //cmdの戻り値の登録アイテムを実行旧言語のリテラルである無名括弧と混ぜて使ってると意図しない動作になります。こ…

Context Self Lookup (last-mod: 2010-06-29)

gs

ver0.6よりローカルコンテキストに並列に定義されたメソッド同士が呼び合う場合、selfを使う必要がありますが、ver0.6.2よりContextがcallされた際にselfも探索対象になったため、context callは書き換える必要はありません。ver0.6.3よりcallだけでなくset…

新しいindexのまとめ

gs

ver0.6.2から変わりました。 .{n}はindex_safe。アクセス不可の場合にNilを返す。index(.[])はエラーになる。Mapの場合はindexは新しくmappingするが、index_safeはしない。 {0 1 2}.{1} //1 {0 1 2}.{3} //Nil {0 1 2}.{-1} //2 {0 1 2}.{-3} //Nil.{n} = v…

Container.each, collect, mapについて

gs

戻り値 eachは最後の戻り値がそのまま返る。continue時はその前の、break時はbreakの引数が戻り値になる collectは常にArrayを返す。continueした値やbreak以降の値は戻り値に含まれない mapはselfと同じ型のコンテナを返す。continueした値やbreak以降の値…

ContainerのC++のalgorithm系メソッドについて

gs

これは古い情報です。この件に関する新しい情報はContainerのC++のSTLのalgorithm系メソッドについて - Giraffe+の開発についてのブログです。(2012-04-06追記) func(begin, end, ...)は、func(self.begin, self.end, ...)となる 破壊的なものは!が後置、そ…

index(Object.[x])やslice(Object.[x y])について

gs

配列(Array)や連想配列(Map)や文字列(String)を扱うための構文糖(シンタクスシュガー)、[]構文の解説です。 角括弧内の引数の数が1つならindex、2つならsliceとなり、それに加え、角括弧に=が付くと*_setとなります。 s: 'abcedfg' s.[0] //s.index(0) s.[0 …

Object.@による引数の配列の展開と引数の配列化

gs

Lispのバッククォート構文の,@やRubyの*です。 実引数に置くと、その配列*1が展開されます。 `a b c[a.+ b.+ c].invoke({1 2 3}.@) //6 `a b c[a.+ b.+ c].invoke(10 {2 3}.@) //15 `a b c[a.+ b.+ c].invoke({1}.@ 20 30) //51 `a b c[a.+ b.+ c].invoke(1.…

ファイルを一行ずつ読む

gs

結論から。 Ifstream.new(file_name).scope& `f[ f.lrange.each& `line[ //処理... ] ]Object.scopeは、引数のメソッドをselfを引数に実行後、self.closeを呼ぶメソッドです。self.closeは引数のメソッドで例外が飛んでも呼ばれます。Ifstreamはデストラクタ…

データ型

gs

プロトタイプベースであるため、厳密にどのオブジェクトが型なのかという分別は内部的にはありません。とはいえ、型として扱われるために定義されているデフォルトのオブジェクトというものは存在し、リテラルオブジェクト等はそれらの子供として生成されま…

SourceForgeのgs.exeについて

gs

ダウンロードページ せっかく公開してるので紹介しておきます。 Boost.Testを使ったテストプログラムなのですが、ついでに少し普通のインタプリタみたいなことができるようにしてあります。 コンソールで言語の動作を確認したり、スクリプトがどうパースされ…

オブジェクトの作り方

gs

メソッド(メンバ関数)とプロパティ(メンバ変数)を1つずつ持つオブジェクトを例に、クラス風オブジェクト作成や継承について解説します。 obj: Object.clone obj.var:: 0 obj.func: `x[ self.var.* x ] //以下テスト obj.var.= 10 obj.func(2).flush //20が出…

メソッドコール時のObject.@による配列等の展開

これは古い情報です。この件に関する新しい情報はObject.@による引数の配列の展開と引数の配列化 - Giraffe+の開発についてのブログです。(2007-10-24追記) Lispのバッククォート構文の,@やRubyの*です。コール時のみで、引数の残りを配列として受けとること…

(def|set|get)_copyとMethod.&=, |=, =&, =|

gs

あるメソッドにORやANDで別のメソッドを結合するとき、getとsetで2回同じメソッド名を表記しなければいけません。 Object.method@ `[ ... ].| (Object.method$) 冗長です。これを解決すべく、Methodオブジェクトに&=, |=, =&, =|を定義しました。'='が引数の…

index(Object.[x])やslice(Object.[x y])について

これは古い情報です。この件に関する新しい情報はindex(Object.[x])やslice(Object.[x y])について - Giraffe+の開発についてのブログです。(2007-10-29追記) 配列(Array)や連想配列(Map)や文字列(String)を扱うための構文糖(シンタクスシュガー)、[]構文の…

Struct.new2と構造体の使用の実践

Struct.newは引数に型名と値名を取る形式でした。そうでなければ、はじめの引数が数値の場合にアラインメント(#pragma packの引数)扱いしたり、値名の後に数値を置くことで配列を扱うという仕様に出来ないからでした。 問題は、そういう仕様である必要があっ…

if, unless, ?, !

gs

もっとも単純かつ使用頻度の高い分岐手段です。Object.ifはselfがtrueの場合に第一引数を、falseの場合には第二引数をそれが存在する場合に評価します。第三引数以降が存在する場合は、第二引数の結果がtrueなら第三引数を、falseなら第四引数を…と繰り返し…

gsをSourceForgeに公開しました

gs

http://sourceforge.net/projects/giraffe-script/です。 とりえあず、テストプログラムのバイナリとビルド可能なソースをFilesに置いておきました。 ビルドにはBoost(ForeachとRange_exも)とBoehmGCが必要です。VC++7.1以外でのビルドは想定してません。

文法 Quick Reference リテラル

gs

リテラル(数値以外) リテラルオブジェクト説明 "string"Stringエスケープシーケンスを含む文字列 'string'Stringエスケープシーケンスを含まない文字列 r/body/optionRegex正規表現。optionについてはRegex.newの第二引数を参照 :symbol_idSymbol_id文字列の…

演算子と演算子化記号

gs

二項演算子(バイナリオペレータ)の概念を、「引数をひとつ取るメソッド」とし、引数のための括弧を省略できるようになっています。 0.+ 1 //0.+(1) `0[0].|`n[n.+ recur(n.- 1)] //`0[0].|(`n[n.+(recur(n.-(1))])演算子の戻り値のメソッドを呼ばなければい…

def, set, get, def_or_set, set_or_def, get_or_def and *_safe

gs

基本のスロット操作であるこれらには省略記法が定められており、それぞれ下記のようになります。 n: 0 //def(:n 0) //第1引数の名に第2引数の値を置く。親のスロットは無関係。定義済みの場合は例外が発生。 n@ 0 //set(:n 0) //第1引数の名に第2引数の値を…