関数型プログラミング言語でLisp方言の1つのClojureを触ってみました。kzakzaコンテンツへスキップ☰Archiveskzakza関数型プログラミング言語でLisp方言の1つのClojureを触ってみました。7つの世界』(オーム社)の第7章で紹介されているClojureです。ClojureについてClojureは関数型言語Lisp方言の1つです。Lisp、Schemeなど多くの方言をもっています。7つの世界』は選択しています。ここではClojureの紹介をしていくつもりですが、私にとって初めてさわる「Lisp」であり、Lispとしての特徴とClojureとしての特徴の区別がほとんどつかないため、Lispの特徴とClojureの特徴が混在した紹介にならざるを得ませんでした。7つの世界』だけではなく、Web上の掲載されている様々な情報を参考にさせていただきました。Lionへのインストールの場合、HomeBrewでLeiningenをインストールすれば必要なものがもろもろインストールされて一発でした。Hello,World起動と終了は以下の通り。終了方法は最初にそれを知った時に「なるほど、そうか!」という気分になりますね。(exit)$[/shell]文字列はダブルクォートで囲います。“Hello,World”)Hello,Worldnil[/shell]制御構文はこんな感じ。(1+1)*(5-1)をあらわしています。)で括弧って要素を空白で区切って記述します。“2”)というコードも同じ記述方法で記述します。Lispはあらゆるものがリストだと言われ、データ以外のコードも必要に応じてリストとして処理することができます。これがLispが強力なメタプログラミング機能を持つ理由の1つであるようです。コードの記述はリストの最初の要素として関数や演算子などを記述する前置記法と呼ばれる記述方法で記述します。残りの要素は引数です。3)とそのまま記述してしまうと最初の要素が関数と評価されてエラーになってしまいます。list関数を使用するか、括弧の前にアポストロフィ(‘)を置きます。3)[/shell]ちなみに式とコードと混同しやすいため、Clojureでは慣習的に式はリストで、データのセットは後述するペクタを使用するそうです。ベクタ・セット・マップペクタ(vector。]で記述するデータセットです。角括弧を使用せずとも、リストでvector関数を使用してもベクタを生成できます。3][/shell]慣習的な使い分けはともかく、その機能を見る限り、データセットとして使用する場合のリストとベクタの違いがよくわからなかったのですが、内部構造でのデータの持ち方が異なるようです。リストとベクタは要素の順序が重要な意味を持ちますが、意味を持たないセットというデータセットもあります。3}[/shell]キーと値を対応づけるRubyでいうハッシュに相当するデータセットがマップです。値}という順序で並んでいます。キーはコロンをつけたシンボルが使用されます。1}[/shell]読みづらいということで、Clojureではキーと値ごとに区切り記号としてカンマをいれることも可能です。1}[/shell]6.シーケンスシーケンスとは・・・とかけるほどシーケンスのことをよく理解していませんが、リスト、ベクタ、セット、マップ、文字列、ファイルシステム構造をラップして共通のインターフェイスを提供する抽象化されたなにか(型?)のようです。共通の関数が使える、ということですかね。“abc”)3[/shell]7.変数Clojureでの変数の定義以下を読むとdef関数を使用するようです。a1[/shell]一度変数を定義しても変更可能な(mutable)ようです。a2[/shell]ソフトウェアトランザクショナルメモリを使用して同じ変更可能な場所をより安全に参照するためにデータをラップするref関数というものもあるようです。“Totoro”)#[/shell]ref関数でラップした値をdef関数で変数とひもづけることで参照することができるようになります。movie)“Totoro”[/shell]参照するときは変数の頭に@をつけるか、deref関数を使用します。refsref関数でラップしたデータは同じトランザクションのスコープ内でしか変更することができませんが、そのスコープ外でデータをラップするためにアトムといものがClojureにはあります。“world”)“Hello,world”[/shell]defn関数は引数をうけないとエラーを検出していまうようですが、引数を受け取らない関数を定義する場合は、fn関数では無名関数をつくり、それをdef関数で変数に代入?する方法があるようです。Specification)になるようです。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。