忍者ブログ
おそらく活動状況とか、他愛もないこととか書きます。 μ崎みのりの気ままで気まぐれなブログです。 作曲とか、ゲーム製作なんかしてます。
[1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

最近は、4D表示のためのスクリプト言語を開発してからプログラミング言語自体を作ることに熱いμ崎です。
中でも私は関数型言語に結構惹かれます。純LISP、HaskellやF#などを見てみました。
そして実装や理論面の話も色々と調べました。

全2分木構造、SKIコンビネータ、モナドあたりが理論面で惹かれたところですね。
機能面だとF#のパターンマッチと判別共用体です。
ポリフォーリズムの表現としては個人的に継承より分かりやすい気が……(笑)

全2分木構造はLISPで扱うデータおよびプログラムコードの構造そのものでした。
SKIコンビネータは3種類(実質2種類)の関数だけでチューリング完全に
なってしまうようなある種「究極の関数型言語」といったイメージ。
どちらも本質は意外なほど単純で、いかに各言語がうまく扱っているかが分かります。

モナドは、最初難しかった割には本質は意外と単純でした。
知らないプログラミング言語で解説されるから分かりにくかっただけのようです。
C#erなら(実際には実装できないものの)ジェネリック型に対するインターフェイスだと思って出発すると理解が早くなりそうです。
http://matarillo.com/general/monads.php
↑私は、ここでかなり理解できました。

ジェネリッククラスM<T>(とくに、T型の値を格納するようなもの)に対して

static M<T> Unit<T>(T value)
static M<T2> Bind<T1, T2>(M<T1> source, Func<T1, M<T2>> selector)

が実装でき、このメソッドの性質が結合法則やらの法則を満たせば、そのクラスMはモナドであると言えそうです。
Unitメソッドは、単純なコンストラクタに対応します。つまり、クラスMが格納する単一の値を指定してMのインスタンスを作成するメソッド。
Bindメソッドは端的に言って、ある型引数のM<T1>を別の型引数のM<T2>に変換するメソッドです。
私としては本質はこれだけのことに思えます。
重要なのは、「T型の値を単純に取り出す手段が存在しなくてもいいこと」でしょうか。


haslellで説明されると、>>=演算子とreturn関数という名前にどこか惑わされる感じがありました。
破壊的操作をラッピングするためなのか>>演算子とfail関数も要求していますし。
元ネタである圏論のモナドも調べましたが(半分理解できてればいいほう)、本質的には「型引数」「Unit」「Bind」の3つでいい気がします。
PR
世界で2番目に古い高級プログラミング言語であるLISP。
実装が簡単であるらしく、興味がわいたので私もLISP処理系を実装してみることにしました。
確かに実装は簡単で、1日で十分に完成しました。

実装後に「200行でLISP処理系を実装」というページを見かけたので、
今度はどれだけソースを短くできるか試してみることに。
少し方向性のおかしなリファクタリングを経て、
C#にて115行でLISPの最小構成を実装することができました。

最小構成なので、5種類の関数・4種類の特殊形式に加え、アトムはtとnilのみ。
quoteの省略表現を実装しても116行です。

いくつかの処理においては、内部で発生する例外をtry-catchで補足しずに、そのままLISPの例外とみなしてスローしています。
型もConsセルを定義したのみで、その他は全て標準ライブラリから使い回し。
nilはC#のnullをそのまま流用、tは読み取り専用にしたobject型インスタンスという手抜き工事。

それでもLISPとして動くというのだから、不思議なものです。
お久しぶりです。

C#でプログラミングしていると、たまに「こんな言語仕様があったらいいな」と思うことがあります。
C#は言語仕様がどんどん進化しているプログラミング言語ですから、もしかしたら将来のバージョンでは…なんてことも思ったりします。
まぁ、私が欲しい機能なんて実装されないでしょうけどね。


最近思うのはプロパティやインデクサをカプセル化するオブジェクトがないことですね。
どちらも実体はメソッドと同じですが、メソッドと違って簡単にデリゲートに代入する手段が存在しません。
強引に代入したければリフレクションを使うしかないと言う…。

VB.NETではプロパティを参照渡しできる(ように見える記述が可能)らしいです。

この機能がどうしても必要な場合、私はAccessorジェネリッククラスというのを用意します。

public class Accessor<t>
{
  public Func<t> Getter { get; private set; }
  public Action<t> Setter {get; private set; }
}

おおまかな実装はこんな感じ。コンストラクターやユーティリティ系は略。
プロパティの取得と代入をそれぞれデリゲート化して保持するだけのクラスです。
必要な個所が少なければ参照渡しの代わりにgetter・setterをラムダ式で渡すようにすればいいんですが、内部処理が重かったり使用箇所が多かったりする場合は使用されるクラス側でAccessorを公開しておくと捗ります。


……当然、プロパティをやめてGetValue・SetValueメソッドにすれば済む話なのですが(笑)。


Func<int> getter = get(Object.Property);

みたいな感じでGetメソッドを取得する構文用意してくれませんかね? あっても使わなさそうですけどね……。
単に「4次元」と言った時、人はどう捉えるのでしょうか。
そもそも「4次元」という言葉の本来の意味は「1点を決めるのに4つの変数が必要な(抽象的な意味での)空間」です。
それがユークリッド空間だろうが、非ユークリッド空間だろうが、ミンコフスキー空間(=時空)だろうが構わないわけです。

しかし、一般人は抽象的な4次元ではなく、その具象として捉える人が多いはず。
私自身、「4次元」という言葉を暗に「4次元ユークリッド空間」という意味で使うので、
だいたいみんなもそうだろうと思っていました。

しかし、世に存在する「4次元」には他にも色々な意味があります。
前述した物理学・数学的な意味での「4次元」はもちろんのこと。
例えば、3次元空間に「精神の軸」なんかを足したオカルトだったり。
ドラえもんの存在により、「SF」「物理法則が適用できない」なんていうイメージを抱く人も多いのではないでしょうか。


……というわけでですね。
検索やらなんやらして調べたんです。
その結果、大半の人が「なんかすごいもの」という捉え方だろうという結論に。
きちんと理解している人の中では、4次元時空と捉える人が多いみたいですね……。
今まで当然のように使ってきた「4次元」という言葉。
なんだか私の使い方が異端児な予感がします。
表現には気を付けなければ。
非凸一様多胞体について調べるうちに、1800を超える一様多胞体を(発見されているものについて)ほぼ全て網羅した英語のサイトを発見しました。

……私は軽い気持ちで(?)非凸な一様多胞体に手を出したのですが、
その考えが甘かったことが分かりました。
正直、私の手におえない気がします。

非凸を許した場合、3次元よりも複雑な「例外パターン」が多く現れるようで。
私が気に入ったのは「swirlprism」のグループ。和訳すると……渦巻き角柱、でしょうか。
なんだかかわいい名前ですね。
大反角柱の正5角反柱は10個ずつでリングを作っていますが、このリング構造だけを使って
正5角反柱×120個(600個だったかも)でひとつの多胞体にできるみたいです。
対称性は大反角柱以上正600胞体未満のようで、ワイソフ構成不能。
見付けた人すごい。
頂点配置が正600胞体と同じで、モデル作成はそれほど難しくなさそうなので、チャレンジしてみようかな。
忍者ブログ [PR]