2004-12-03 [長年日記]
λ. 探索的モデリング
BayoNet をインストールして遊ぶ。ユーザーインターフェースはあまり良くない気がするけど、いじってみると結構楽しい。SFC生なら BayoNet Version 3.0.8 利用申請 からダウンロードして遊ぶべし。
λ. 不思議ちゃんの小気味よさ
(『Emily: The Strange』の感想を IRCから転載)
Emily は独特の世界を持った奇抜でブラックな少女で、他人と馴れ合うことな く自分のスタイルを曲げない。本書を読めばわかるが the Strange と言われる だけのことはある。日頃妥協に妥協を重ね他人に馴れ合う日々を送っている自 分としては、彼女のそういったところには小気味よさを感じた。
それから、こんなポジティブなことをこの本から読み取るのは間違っている気 がしてならないのだが、Emily doesn't cheat... she plays by her own rules. という一文にはハッとさせられた。我々も既存のルールの中で努力す るばかりではなく、時にはルールを変えてしまうような変革を目指すことが必 要なのではないだろうか。
ただ、もし仮に彼女が身近に居たら困ってしまうだろうことも間違いない。 なにしろ、the Strange 、不思議ちゃんですからね。
ところで、本のデザインもとても素晴らしかった。白・黒・赤の三色を基本と して部分的にツヤ出し(?)を使っただけの非常にシンプルなデザインなのだけ ど、これらが非常に効果的に使われていて、独特の世界を構成している。この デザインだけでも本書を手に取る価値はあるだろう。
- Quotation
-
Emily doesn't cheat...
...she plays by her own rules. - Excellent Translation
-
エミリーはズルをしない……
……自分のルールでやるだけだ - Explanation
- 彼女のルールでは、スペードのエース5枚のファイブカードもアリだし、それからお札の額を書き換えてしまうのもアリなのだ。
2004-12-04 [長年日記]
λ. Re: スーパータイピング
もし member :: (Ord u) => UrelemOrSet u -> Set u -> Bool
のように UrelemOrSet u
が負の位置に現れる関数だけなら、私も型クラスやGADTを使うことを考えたのですが、toList :: (Ord u) => Set u -> [UrelemOrSet u]
のように UrelemOrSet u
が正の位置に現れる関数もあるので、型クラスを使っても嬉しさは限定的かなと考えてました。
ちなみに超集合(hyperset)というのは、メンバシップ関係∋がnon-wellfounded、つまり x1∋x2∋x3∋... という無限列が存在するような集合のことで、ZFとかだと基礎の公理(FA, Foundation Axiom, 正則性公理)によって排除されてしまう可哀想な運命にあります。どんな公理系で扱うかというと、ZFから基礎の公理を除いただけの公理系だと超集合を扱うには何かと不便なので、そこに反基礎の公理(AFA, Anti-Foundation Axiom)を追加した公理系(ZFA)で普通は扱います。僕のこないだのコードも、基礎の公理(と無限集合の公理)を除いた通常の公理と、反基礎の公理を満たすように書いたつもり。
2004-12-05 [長年日記]
λ. 『さよならみどりちゃん』, 南 Q太
を読んだ。
λ. Cで作ったProcをブロック付きで呼び出すと……
[ruby-dev:25051]。この振る舞いはおかしくて以前の振る舞いが正しい気がする。まぁ、Proc#callに渡されたブロックを参照する方法はまた別に欲しいとは思うけど。
[追記] eval.c (rev 1.744) で修正された。
λ. 停電
年に一度の定期保安点検による構内停電。
2004-12-06 [長年日記]
λ. HaskellでScheme処理系を実装 (1)
研究会で書いてた処理系を、構文木を辿るやつからスタックマシンっぽいやつへと書き換えた。とは言っても操作的意味論すなわち状態遷移規則を素朴に実装しただけ(状態遷移用の関数 trans :: State -> IO State
をひたすら呼び続けるだけ)なので、かえって遅くなってるだろうな。
とりあえず、これで末尾呼び出しの最適化とcall/ccの実装は出来た。あと、だんだんCのコードを生成する方式にしたくなってきた。
2004-12-07 [長年日記]
λ. Hypersetの使い方
何か正しいExampleをとのことですが、Haskellレベルでの循環的な定義はサポートしてないので、循環的な定義をするには代わりに decorate :: (Ord u) => Graph -> Tagging u -> Decoration u
や solve :: Ord u => SystemOfEquations u -> Solution u
を使います。
decorate
はグラフのデコレーションを求める関数です。グラフの表現はData.Graphのものを使っていて、デコレーションは頂点をインデックス、集合を要素とする配列として表現しています。Tagging u
は子を持たない頂点に対して空集合ではなくurelementを割り当てるのに使うFiniteMapです。例えば、decorate (listArray (0,2) [[0,1,2],[],[]]) (unitFM 2 0) ! 0
とすると、A = {A,{},0} という集合が得られます。
solve
の方は等式系(system of equations)の解を求める関数です。等式系は、左辺の変数をインデックス、右辺の集合を要素とする配列で表現しています。ただ、右辺の集合はurelementとして変数を追加しているので、型が Set u
ではなく Set (Either u Var))
になってます。例えば A = {A,B,0}; B = {} という等式系は listArray (0,1) [fromList [Left (Right 0), Left (Right 1), Left (Left 0)], empty]
となります(あんまりにもあんまりなので、何とかしたいなぁ)。これを x
とすると、solve x ! 0
で先ほどと同じ集合 A = {A,{},0} が得られます。
λ. ミーティング
誰も集まってくれないのは何故。しょぼーん。
λ. 『NHKにようこそ! 2』, 大岩 ケンヂ [画], 滝本 竜彦 [原作]
を読んだ。
2004-12-08 [長年日記]
λ. Announce: 圏論勉強会 (第二回)
そうそう。今週末は圏論勉強会の二回目がありますよ。堅苦しい集まりではないし、特に前提知識は必要ないので、圏論に興味のある人は是非お気軽に御参加下さい。(初参加の方は mixi:圏論勉強会(第二回) か haskell-jpメーリングリスト で参加を表明しておくと良いと思います)
- 日時
- 2004年12月11日(土曜) 14:00〜
- 場所
- タイムインターメディア様 2階会議室 (地図)
- テキスト
- Conceptual Mathematics: A First Introduction to Categories
ψ おいなりー [日記本文とは関係ございません。 gtk2 on Cygwin 使わせて頂きました。 GQというGUIのLDAPクライ..]
2004-12-09 [長年日記]
λ. Matlab/Octave関連情報
ザ・フィクション 戯れ言日記 (2004-12-06) より。「Matlab ver. 5.x用ガイド」というのが凄く良さそう。やっぱMatlabくらいは使えないとダメなのかなぁ……
λ. アナタヲ守リタイカラ
財務省の防衛予算大幅削減に抗議するFlash。
それにしても、日本の防衛費はGDP比で見ると現状でさえかなり小さいのに、これ以上減らして大丈夫なんでしょうかね。何しろ日本の周りには、日本の領土を一方的に占領してる国とか、勝手に核開発しようとしてる(してた)国とか、原潜で領海侵犯してくる国とか、事あるごとに反日で燃え上がる国とか、そんな国ばっかだし、それに台湾海峡とか火種もあるわけで……
λ. Tarmo Uustalu, Varmo Vene and Alberto Pardo, Comonadic Iteration
を読んだ。CiteSeerでのタイトルはなんで Comonadic Iteration じゃなくて、Recursion Schemes from Comonads になってるんだろう……。
ちなみに、著者の一人の Varmo Vene は Categorical programming with inductive and coinductive types. (2004-06-29の日記を参照)の著者。
λ. Category extras
というのを発見。圏論の幾つかの概念をHaskellで実装していて、上の Comonadic Iteration で定義しているコンビネータなんかも実装されている。殆んどのコードは自明なものだけど、Fixpointという型クラスを導入することで、Fixによって定義したデータ型以外のデータ型もFunctorの不動点として扱えるようにしているのが面白かった。
class Functor f => Fixpoint f t | t -> f where inF :: f t -> t outF :: t -> f t fold :: Fixpoint f t => (f a -> a) -> t -> a para :: Fixpoint f t => (f (t,a) -> a) -> t -> a ...
2004-12-10 [長年日記]
λ. 201/211/222
現実逃避に久しぶりにプレイ。妹紅たんを苛めて「グランギニョル座の怪人」と「深弾幕結界 -夢幻泡影-」に挑戦可能にしてみる。これでラストワードが全部出揃ったので、取得/挑戦可能/総数が201/211/222に。
λ. ユーモラスな切り口による日本人論
(『The Japanese Mind』の感想をIRCから転載)
この本では、「朝令暮改」や「口は災いの元」といった諺や、「年功序列」と いった言葉を切り口として、日本の「社会生活上の価値基準や行動」をアメリ カのそれと比較し論じている。
はっきり言って、著者の主張には「的外れだ」「誇張されてる」「偏見だ」と 反発したくなるものも多いが、諺や成句を切り口ととして語っているため、主 張の内容には同意できなくても、着眼点と考え方を楽しみながら読むことが出 来る。
例えば、「朝令暮改」についての章では、方針が頻繁に変わることから、日本 人が方針を決めないことを好むことについて論じている。「朝令暮改」という 言葉の本来の意味は「命令や方針が頻繁に変わって一定せず、当てにならない こと」ということだが、著者はそこに留まらず、方針が頻繁に変わって一定し ないのは状況の変化に対応できるよう方針を決めないで置くからだと推測する。 そうして展開される議論は、同意は出来ないが、ユーモラスであると同時に新 鮮で、とても面白い。
本書は真剣な日本論/日本人論として読むよりも、著者の日本の特徴に対する 着眼点や議論の切り口を楽しむために読むのが良いだろう。
- Quotation
- An intellectual is anyone who reads books to learn, to broaden his horizons. We can all become intellectuals if we put books ahead of tennis and drinking parties. This is what a college education should do. It should stimulate us to cultivate our intellect in order to better understanding ourselves and the world we live in.
- Excellent Translation
- 本から学び、視野を広げようとする人はみな知識人だだし、テニスや飲み会よ りも本を優先すれば、誰でも知識人になれるのだ。これこそ大学教育のすべき ことだろう。大学は我々自身と我々の生きるこの世界をもっと理解するために 知性を磨きたくなるような刺激を学生に与えるべきなのだ。
- Explanation
- 「がり勉」という言葉に関する章の最後の言葉。著者は学ぶことへの好奇心を失ってしまった学生を嘆いている。
2004-12-11 [長年日記]
λ. HaskellでScheme処理系を実装 (2)
多値を実装。(call-with-values producer consumer)
は consumer への参照を含む特別なフレームをコントロールスタックにプッシュして、producerを呼び出すことにした。(values arg1 arg2 ...)
でコントロールスタックのスタックトップを確認して、それがcall-with-valuesによって作られたフレームだったら、引数をそのまま引き渡す形でconsumerにジャンプする。
何も考えずに実装しちゃったけど、こんなのでいいのかな?
λ. 第二回圏論勉強会
というわけで、先日書いた通り、圏論勉強会の二回目がありました。人数も増えて結構盛り上がったし、とても楽しかったです。
- CategoryTheory:圏論勉強会 (sampou.org, Programming in Haskell)
2004-12-14 [長年日記]
λ. HaskellでScheme処理系を実装 (3)
末尾再帰で10000!を計算すると、とりあえずGuileと同じくらいのスピードは出てるのだけど、fib(30)を素朴な再帰で計算したらやたら遅かった。プロファイルをとってみたら total alloc が 13GBほど。そりゃ遅い気がする。
こんなにメモリを消費している理由を確認するためにVMのコンパイル結果を-ddump-stg
でダンプしてみると、予想通り命令一ステップ実行するごとにlet
が……。最適化でアンパックされると思ってた引数/返り値のデータ構造を毎回ヒープに割り付けてるよ、うわーん。
色々と試してみると、GHC の worker wrapper transformation は、返り値の型がネストしたデータ構造だった場合にトップレベルしかアンパックしてくれないっぽいな。引数の方はネストしててもアンパックしてくれるから、これは CPR analyser の制限なのかな? あと、正格性解析によって引数がアンパッカブルと判定される条件もいまいち良く分かってないんだよなぁ。
一応 single threaded な使い方はしてるはずだから、アンパックしてくれなくても single threadedness を検出して破壊的に更新してくれるってのでもいいんだけど……それも叶わないし、切ないね。Haskellにも linear type があればいいのにと初めて本気で思ったよ。
とか、ぐだぐた考えながら、自分でアンパックしたコードを書いてプロファイルを取ってみる。total alloc は 13GB から 4GB まで減り、実行時間が110秒から70秒に減った。また実行時間にしめるGC時間は20%から14%に減った。むー、思ったより速くならなかったな。まあスタックとかもリストで表現してるし、他にも色々と富豪なことしてるから、こんなものか。さて、どうしようかな。
λ. Constructed Product Result Analysis for Haskell, Clem Baker-Finch, Kevin Glynn, Simon Peyton Jones
.
λ. GHC の worker wrapper transformation への不満
(2005-09-11 追記) 上で「GHC の worker wrapper transformation は、返り値の型がネストしたデータ構造だった場合にトップレベルしかアンパックしてくれないっぽい」と書いたことについての簡単な具体例。GHCの worker wrapper transformation だと、内側のタプルがすぐ消費される場合でもヒープに割り当てられてしまう。
- 元のコード
-
test :: Int -> (Int, (Int,Int)) test x = (x,(x+1,x+2))
- GHC の worker wrapper transformation
-
{-# INLINE test #-} test :: Int -> (Int, (Int,Int)) test x = case wtest x of (# a, b #) -> (a, b) wtest :: Int -> (# Int, (Int,Int) #) wtest x = (# x, (x+1, x+2) #)
- 期待する worker wrapper transformation
-
{-# INLINE test #-} test :: Int -> (Int, (Int,Int)) test x = case wtest x of (# a, b, c #) -> (a, (b, c)) wtest :: Int -> (# Int, Int, Int #) wtest x = (# x, x+1, x+2 #)
(2005-09-16 追記) ちなみに、GHCではIO型は「newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))」と定義されているので、IO型を返すような関数は同じ制約を受ける。IO型を利用したコードが遅くなる一つの理由がこれだと思う。
- 元のコード
test2 :: Int -> IO (Int,Int) test2 x = return (x,x+1)
- 期待する worker-wrapper transformation
{-# INLINE test2 #-} test2 :: Int -> IO (Int,Int) test2 x = IO (\s -> case wtest2 x s of (# s, a, b #) -> (# s, (a,b) #)) wtest2 :: Int -> State# RealWorld -> (# State# RealWorld, Int, Int #) wtest2 x s = (# s, x, x+1 #)
【2006-04-28追記】 GHC-6.4.1の compiler/cprAnalysis/CprAnalyse.lhs には以下のように書いてあった。うーむ。「enabling this would lose laziness」が何故なのか良く分からない。
The analysis here detects nested CPR information. For example, if a function returns a constructed pair, the first element of which is a constructed int, then the analysis will detect nested CPR information for the int as well. Unfortunately, the current transformations can't take advantage of the nested CPR information. They have (broken now, I think) code which will flatten out nested CPR components and rebuild them in the wrapper, but enabling this would lose laziness. It is possible to make use of the nested info: if we knew that a caller was strict in that position then we could create a specialized version of the function which flattened/reconstructed that position.
It is not known whether this optimisation would be worthwhile.
So we generate and carry round nested CPR information, but before using this info to guide the creation of workers and wrappers we map all components of a CPRInfo to NoCprInfo.
2004-12-15 [長年日記]
λ. 深弾幕結界むりー
「季節外れのバタフライストーム」「フェニックス再誕」「スカーレットディスティニー」を回収。これで取得/挑戦可能/総数は204/211/222に。あと、「インペリシャブルシューティング」と「深弾幕結界 -夢幻泡影-」も少し粘ってみたけど、これ無理ー。
2004-12-17 [長年日記]
λ. First Steps in Modal Logic の Theorem 10.3
- 10.3 THEOREM.
Let S be a canonical formal system with canonical valued structure (𝔖,σ). For each formula φ the conditions
- 𝔖 ⊩u φ
- (𝔖,σ) ⊩v φ
- ⊢S φ
- ⊨Sv φ
- ⊨Su φ
are equivalent. In particular, each canonical system is Kripke-complete.
この定理の証明に Finally the implication (v)⇒(i) is an immediate consequence of canonicity.
とあるが、このどこにcanonicityが利いてくるのかが良くわからなくてちょっと詰まった。
関係⊨Suの定義から ⊨Su φ ⇔ (∀A. (∀ψ∈∅. A ⊩u ψ) → A ⊩u φ) ⇔ (∀A. A ⊩u φ) ⇒ 𝔖 ⊩u φ という風に言えてしまわない? と最初思ったのだが、これは関係⊨Suの定義を勘違いしていたためだった。 正しい定義は Φ ⊨Su φ ⇔ Φ∪S ⊨u φ なので、証明は ⊨Su φ ⇔ S ⊨u φ ⇔ (∀A. (∀ψ∈S. A ⊩u ψ) → A ⊩u φ) ⇒ 𝔖 ⊩u φ となる。formal system S がcanonicalだということの定義は 𝔖 が S のモデルであること、つまり ∀ψ∈S. 𝔖 ⊩u ψ なので、最後のステップが言える。
これなら納得。それにしても下らないことで時間を費やしたものだ。
λ. 異文化理解には相手の文化や信念の尊重が重要だが……
(『A Question of Belief』の感想をIRCから転載)
ペーターとメリーは、南太平洋に浮かぶ島国のシャーマニズムの影響が色濃く 残る村にボランティアとして赴任し、村人の生活向上を目標に意気揚々と活動 する。ある日メリーは衛生のために村の子供たちの体を洗い服を着替えさせる が、それは村の伝統に反し、シャーマンの怒りを買ってしまう。その数日後か らメリーは足の痛みを感じだし……
というちょっと神秘的な雰囲気のあるサスペンスであると同時に、援助や開発、 異文化理解の難しさについても教えてくれる小説である。少々不思議な読後感 の残る小説だと思う。
メリーに起こった異常はシャーマンの呪いだったのか、それとも医者の言うよ うに彼女自身の呪われたという思い込みのせいだったのか、というのがタイト ルの A Question of Belief の由来であり、物語の核心である。そう。人は信 念によって生きていて、時として思い込みによって人が死んでしまうことすら あるのだ。作中では医師が次のように語っている。
Sometimes people die, because they believe they are going to die. There is no other reason.
全く驚くべきことである。そして人が信念によって生きている以上、精霊や呪 いが本当に存在するかどうかはともかく、我々の「科学的」世界観が正しくて、 彼らの世界観が間違っていると決め付けていては、異文化理解は出来ないし、 開発や援助も出来ない。そういう意味では作中の
And the villagers' beliefs in spirits and in the powers of the shaman were important to them. I realised that it wasn't necessary for me or anyone else to change their spiritual beliefs to make their lives better.
というのは正しい。だが、現実はそう単純ではないのだ。例えば我々は人権を 普遍的価値と考えているが、我々の援助対象となる地域では女子割礼などそれ に反する文化があることもある。女子割礼の場合には現実に防止への取り組み が行われているし、単に文化や信念に干渉しなければ良いという問題ではない。
この小説を読むことで、あなたもちょっと不思議な読後感を感じるとともに、 きっと色々と考えさせられるのではなかろうか。
- Quotation
- `There is, Peter, there is!' she said. She grabbed my arm. `This thunder and lightning means the spirits of this island are angry with me. I know it!'
- Excellent Translation
-
「そこにいるわ、ペーター、そこにいるの!」
メリーはそう言って僕の腕を掴んだ。
「この雷は島の精霊が私に怒ってるんだわ。私にはわかるの!」 - Explanation
- 足の痛みが直らないメリーを医師に診てもらうため、村から遠く離れた都市へと二人が行こうとする途中の情景。メリーの恐怖が伝わってくる。
2004-12-18 [長年日記]
λ. RHG読書会::東京 Reloaded
2週目終了。
λ. 『猫の地球儀 焔の章』, 秋山 瑞人 著, 椎名 優 イラスト
を読んだ。今頃になって読むのは、かなり今更な気もするけど。
ψ こがさやか [こんにちは。どうしてるかなあと思って調べてみたら日本にいないんですか???びっくりしました。蓮尾君のやってることは理..]
2004-12-19 [長年日記]
λ. category.rb導入
ふとこの日記にもcategory.rbを導入してみる。ちゃんとカテゴライズしてあれば便利そう。過去のエントリーも少しはカテゴライズしておこう。
λ. 『ネガティブハッピー・チェーンソーエッヂ』, 滝本 竜彦
を読んだ。読み終わってから気づいたのだけど『NHKにようこそ!』と作者同じなのか。
λ. フェイスオフ
たまたまテレビでやっていたので見た。最初は全然期待してなかったのだけど、面白かった。
2004-12-20 [長年日記]
λ. ニューラルコンピューティング
基礎教養としての Logic と Thermo Dynamics の重要性をずいぶん強調してた。
それと、何でも熱力学では最近Adrian Bejan教授らの Constructal Law というのが熱力学の第四法則と言われてるそうだ。この Constructal Law を使うと、試行錯誤したりせずに、最初から最も効率のよいものを設計できるそうだ。って、本当かよ?
あと、Logic についての説明には色々とツッコミたくて仕方なかったけど、我慢我慢。なんというかハッタリが巧いなぁと思いますた。
2004-12-22 [長年日記]
λ. 参戦中
久しぶりに参戦中。
λ. 『アポロ13号 奇跡の生還』, ヘンリー・クーパーJr (Henry S.F. Cooper, Jr) 著, 立花 隆 訳
を読んだ。絶望的な状況下で、問題の原因を推理し、シミュレーションし、対策を検討し、そして意思決定する。この過程が何とも手に汗握りますな。
λ. 冗談言うな!朝鮮半島は永遠に日本の領土だ!baka!
韓国併合ニ関スル条約の第一条「韓国皇帝陛下ハ韓国全部ニ関スル一切ノ統治権ヲ完全且永久ニ日本国皇帝陛下ニ譲与ス」を根拠に朝鮮半島は永遠に日本の領土だという釣り。かなりワロタ。本当に日韓基本条約を知らないのかよ。
【2008-12-23追記】 消えてしまっているけど、Internet Archive に残っていた。
2004-12-26 [長年日記]
λ. ghciのローダー (1)
あるパッケージをghciでロードしようとしたら unknown symbol `hs_free_fun_ptr' で panic を起こした。hs_free_fun_ptrはrtsパッケージで定義されてるはずだけど……
λ. ghciのローダー (2)
あと、extra_librariesで指定したライブラリの実体が GNU ld script だとエラーになるな。
2004-12-27 [長年日記]
λ. bmcall()でのsvalue_to_avalue()
Method#to_procで作るProcの実体であるbmcall()は、引数をsvalue_to_avalue()で単値から多値へと変換してるけど、最初から多値で受け取ればいいのにと思った(bmcall.diff)。でも、こうなってるのにはきっと何か理由があるんだろうなぁ。
λ. Banshee - A toolkit for building constraint-based analyses
BANSHEE is a toolkit that simplfies the task of building
constraint-based program analyses. Program analyses are widely used in
compilers and software engineering tools for discovering or verifying
specific properties of software systems, such as type safety and
opportunities for program optimization. To use BANSHEE, the analysis
designer provides a short specification file describing the kinds of
constraints used in the analysis. From this specification, BANSHEE
builds a customized constraint resolution engine which solves those
constraints very efficiently. BANSHEE also builds a customized
interface for that engine which is easy to use.
BANSHEE is the successor to BANE, the Berkeley ANalysis Engine, which
can be found here.
メモ。バンシーっていうと北欧の方の女の妖精だったっけ。
2004-12-28 [長年日記]
λ. 可変長引数の関数?
multi-parameter class を使って可変長引数っぽいことが出来ないかと思って、ちょっと試してみた。引数の型を明示する必要があるのがイヤだな。
class VAFun arg result x | x -> result where collectVAList :: ([arg] -> result) -> [arg] -> x instance VAFun arg Int Int where collectVAList k xs = k (reverse xs) instance VAFun arg result x => VAFun arg result (arg -> x) where collectVAList k xs x = collectVAList k (x:xs) withVAList :: VAFun arg result x => ([arg] -> result) -> x withVAList k = collectVAList k [] vaSum :: VAFun Int Int x => x vaSum = withVAList sum
*Main> vaSum <interactive>:1: No instance for (VAFun Int Int x) arising from use of `vaSum' at <interactive>:1 In the definition of `it': it = vaSum *Main> vaSum :: Int 0 *Main> vaSum 3 2 :: Int <interactive>:1: No instance for (VAFun Int Int (t -> t1 -> Int)) arising from use of `vaSum' at <interactive>:1 When checking the type signature of the expression: vaSum 3 2 :: Int In the definition of `it': it = vaSum 3 2 :: Int *Main> vaSum (3::Int) (2::Int) :: Int 5
[追記] collectVAListではなくwithVAListをVAFunのメソッドにしてしまえる。ytsの日記(2005-01-02) を参照のこと。
2004-12-29 [長年日記]
λ. bmcall (2)
27日の続き。
いっその事proc_invoke()で引数の変換を行うのを止めて、全部rb_yield_0()でやればいいのに。って気が少しした。それと、svalue_to_avalue()が配列でないオブジェクトを返すことがあるのは、svalue⇔avalueの変換のround-tripのためかな。