読者です 読者をやめる 読者になる 読者になる

c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programmingに分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡

音樂はSoundCloud等バラバラの場所に公開中です。申し訳ないがlinkをたどるなどして探してください。

考察は現在は主に此のblogで公表中です。

programmingは、ひろくみせるものはGitHubで、個人的なものはBitBucketで開発中です。

c4se

関数合成型 ( Forth 系) 言語 Factor への入り口

マイナー言語 Advent Calendar 2013 25日目です。飛び入りました。昨日はSQL - 僕の記事を見て魔法少女(Presto使い)になってよ - Qiita [キータ]でした。Prestoって言ったらOperaのPresto(滅びました。

Nemerle 好いですね。
cf. クエリな午後: マイナー言語 Advent Calendar 2013 #16: Nemerle について http://lambdalice.blogspot.jp/2013/12/advent-calendar-2013-16-nemerle.html
F#とかHaxeとかOCaml系には有りますが、Nemerleは洞うなのかしら。Elixirと同じくsyntax as Rubyな感じ。OOP + FPなScalaとは洞うなんでしょ。

KittenはForth系の連鎖性言語ですね!!
cf. Kittenでスタックと戯れる - Qiita [キータ] http://qiita.com/mandel59/items/523988d1b852925c7fe3
どうみてもPythonですが、好ささうですね…。くそ…。

HyPythonLispでやったもの。ふむ……。
cf. hy - ὑμήνπτερόν - Qiita [キータ] http://qiita.com/futoase/items/f45d5ca41908ac4cff9f

Coq, Agda, Idris系も興味深いです。
cf. ほんとうはこわいIdris 〜 tacticメタプログラミング - Qiita [キータ] http://qiita.com/mandel59/items/d726249e8f371a7ea966

Pixilangって、音も生成できるんでせうか(〃l _ l)??
cf. PixilangでやるAudio Visual Programming - Qiita [キータ] http://qiita.com/mandel59/items/93fd4462a51e1e26fed7


どうも、stackに積んでゐたさっちゃんです(〃l _ l)
AlloyとかAgdaとかもうmajorじゃないですか (認識。SuperColliderも試したかったナ。Elixirはmajorだろヾ(〃l _ l)ノ゙(憤怒。
と云ふ事でFactor http://factorcode.org です。Forth系の連鎖性言語 (Concatenative language) ですね!! くそ…。

Factor

Factorでは (ほぼ) 全てが関数なのですけれども、暗黙の引数として暗黙のstackをとり其所に副作用を加えていくのが、OOPと重ねて興味深く思ってゐます。
cf. 他言語から見た Elixir (macro, protocol, binary構文) http://c4se.hatenablog.com/entry/2013/12/14/231359
Lispと並んでAST (abstract syntax tree, 抽象構文木) が丸見えです。と云ふかForth系に、「構文解析」なんて有って無きが如しです。空白で分割しろ。(ほぼ) 其れが構文解析だ。
(* 5)と云ふLispのcodeは意味を持ちません。5 *と云ふFactorのcodeは意味を持ちます。5はstackに整数5を積む関数で、*はstackから二つの数をとり掛け算し結果として一つの数をstackに積む関数ですから、此の二つを並べると関数合成され、5 *はstackから一つ数をとり5倍し結果として一つの数をstackに積む関数と成ります。部分適用に似てゐますが、関数合成です。

追記 2013-13-27

此れはわたしのLispの無知による間違いだ。*は可変長引数の関数だった。勿論私の論旨は変わらない。Lispには可変長の引数や可変長でない引数が有るが、Factorには「引数」と云ふものは無い。
Haskellのやうなcurry化された言語では部分適用は自然ですから、べつに其れで好いじゃんと云ふ感じもするかもしれませんが、関数適用と関数合成では構造が違う筈です。関数合成はmonoid (モノイド) です。特別な形式の部分を除いて、Factorのcodeは任意の部分を任意に切り出せます。此れはquotation (引用) と云ふ機能として存在します。あ、macroのにほひがする……。任意に切り出せると云ふ事は、評価順序に依存しないと云ふ事に成ります。

関数定義 (wordの定義)

変数なんて無いってば。word (Lisp風に言へばsymbol) 名を局所化する方法は用意されてるかもしれません。helpが読みにくくて其所迄調査してゐません……。
関数を定義します。

: sq ( x -- y ) dup * ;

二乗する関数です。空白は重要です。Lispでやれば、

(define (sq x) (* x x))

ですね。方言が有りますから、此うじゃないLisp処理系も有ります。おやおや? 引数として与えられた値 x が二回使われてますね? いつcopyされたんですか?
冗談です (かなり)。
余談ですが、項の評価が副作用を伴う場合、任意にcopyはできない筈です。完全に余談です。
cf. 1+1ができない子と線形論理 - 檜山正幸のキマイラ飼育記 http://d.hatena.ne.jp/m-hiyama/20070411/1176255532
Factorの二乗関数の定義を分解してみませう。Factorのword定義は、:で始まって;で終わります。sqは定義するword名。次の( x -- y )stack効果宣言 (stack effect declaration) と言い、stackから何を幾つ取り、stackに何を幾つ返すかを宣言します。此のsqでは、数を一つ取り出し数を一つ戻す、と書いてあります。因みに

: sq ( x -- x ) dup * ;

と書いても全く同じです。此のxは変数名じゃありませんよ。数であるべしと云ふ記号です。dup *は、関数合成の結果、数を一つ取り其れを複製し、複製したものとを掛け合わせ結果を返す関数と成ります。*は引数を二つ取って掛け算して返す関数じゃないですよ。引数なんて有りません。言へば、stackをとってstackを返す関数なんですよ (勿論他の解釈は有る訳です。例へば引数をstackから拾って返り値をstackに積む操作子だと考へても好い)。


最終日でした。
長引きさうなので今回は此の辺。はぁ、Kittenなんて今日しりましたし、連鎖性言語 (Forth, Joy系) も調査し直す必要が有りますね。連鎖性言語の始祖はJoyですよ。ForthはJoyが起源として後天的に参照した言語です。ただElixirのmacroをClojure風macroと呼ばずLisp風macroと云ふのと同じやうに、Joy系と呼ばずForth系と呼ぶのです。尊びませう。