非公式チュートリアル05 様々なファンクション
ここでは様々なファンクションを見て行くことにする。今回は内容としてはリファレンスマニュアルに近いものである。
以前のリファレンスマニュアル(ver. 5以前)はアルファベット順で、目的別にまとめられておらず、非常に見にくいものであった。この一覧パッチはその時に作ったものであるが、ver. 6.6.2現在のリファレンスマニュアルは目的別にある程度分かれているので随分見やすくなった。なのでこの一覧パッチもそれほど頻繁に参照するものではなくなったが、今回のチュートリアルは補足的なインデックスとして扱ってほしい。
それぞれのファンクションについて詳しく知りたい場合は、公式リファレンスマニュアルを読むことをお勧めする。ファンクションを選択してdキーを押せば、ブラウザが開きリファレンスマニュアルが開く。これはブラウザで表示されているがオンラインではなく、OpenMusicがインストールされたローカルディスク上にある。ただし一部のファンクションは対応していない。その場合もしそのファンクションがLISP由来のアイコンである場合は、LispWorksまたはさらにその母体のANSI CommonLispのリファレンスマニュアルを見てみると、いずれかで見つかる場合が多い。
まず左上から見て行こう。
first, second, third, fourth ... は、以前も述べた通り、リストの中の特定の値を返すものである。tenthまで有効である。
first, second, third, fourth ... は、以前も述べた通り、リストの中の特定の値を返すものである。tenthまで有効である。
apply は、input 0に接続されたファンクションを割り当てるファンクションである。ここでは + が代入されているが、ファンクションやサブパッチを割り当てることも可能である。これは後にラムダファンクションを扱う時に詳しく説明する。しかしここでは、+ によってリストの全ての値が足されるという使い方を覚えておこう。
apply については以下も参照。
butlast は、リストの最後の値を切り捨てるものである。>キーでオプションを表示させ、1以外の値を入れることによって、複数の値を切り捨てることが出来る。
band-filter は、input 0に割り当てられたリストのうち、input 1に割り当てられた2重のリストの範囲内をpassまたはrejectするものである。この図ではpassでは(1 2 8 9 10)が、rejectでは(3 4 5 6 7)が返される。
first-n は、リストの値のうち最初から指定された数の値を返す。
last は、リストの値のうち最後の値だけが入ったリストを返す。しかし返される値はリストである。この場合は (10) が括弧付きで返される。また複数の括弧からなるリストが与えられた場合は、最後の値がリストであればそのまま返すが、2重括弧となる。
last-elem は、リストの値のうち最後の値がリストから取り出された状態で返す。''この場合は 10 が括弧無しで返される。また複数の括弧からなるリストが与えられた場合は、最後の値がリストであればそのまま返し、括弧は1重となる。
last-n は、リストの値のうち最後から指定された数の値を返す。
list-explode は、リストを指定された数の括弧に割り振る。ここでの出力は ((1 2 3) (4 5 6) (7 8) (9 10)) となる。
list-min は、リストの値のうち最小の値を返す。
list-max は、リストの値のうち最大の値を返す。
list-modulo は、リストを指定した数で割り振り、それぞれの括弧に一つずつ順番に値を割り振る。ここでの出力は ((1 4 7 10) (2 5 8) (3 6 9)) となる。
nth は、リストの値のうち指定された番号の値を返す。LISPは0からものを数えるので、ここでの出力は 4 となる。
nthcdr は、リストの値のうち指定された番号以降のすべての値を返す。ここでの出力は (4 5 6 7 8 9 10) となる。
nth-random は、リストの値のうちランダムの値を返す。
permut-random は、リストの値をランダムに並べ替えたリストを返す。
reverse は、リストの値を逆順に並べたものを返す。ここでの出力は (10 9 8 7 6 5 4 3 2 1) となる。
rotate は、リストの値を指定された数だけ前後に並び替えたリストを返す。>キーでオプションの2番目のインプット(input 1)を表示させることが出来る。3を指定すると (4 5 6 7 8 9 10 1 2 3) となる。負の数を指定しても良く、-3を指定すると (8 9 10 1 2 3 4 5 6 7) となる。
sort は、LISPのsort命令を返す。
sort. (語尾にドットがつく)は、リストの値を最小から最大の順に並べ替える。この語尾のドットがつかないとLISPのsort命令となり、全く違う動きをするので注意。
flat は、複数の括弧で構成されたリストの括弧を取り去り、一つの括弧にまとめる。 ((1 2 3)(4 5 6)(7 8 9)) を指定すると、出力結果は (1 2 3 4 5 6 7 8 9) となる。また、>キーでオプションの2番目のインプット(input 1)を表示させることが出来る。括弧の数を指定すると、指定した括弧の分だけを除去する。例えば3重括弧のリスト (((1 2 3)(4 5 6))(7 8 9)) でinput 1に1を指定すると、出力結果は ((1 2 3) (4 5 6) 7 8 9) となる。
mat-trans は、括弧の中の数値を順番に選択して新たな括弧に並び替える。 ((1 2 3)(4 5 6)(7 8 9)) を指定すると、出力結果は ((1 4 7) (2 5 8) (3 6 9)) となる。これは例えば常に4つの音からなる和音が出力されたとして、それを各声体と見なして水平のメロディを新たな括弧でリストに加えるという用途に応用できる。
car (カー)は、リストの中の最初の値を返す。firstと同じである。
cdr (クダー)は、リストの中の最初の値を取り除いた残りのリストを返す。
(car と cdr は、LISPの基礎に関する重要な知識である。これはLISPを扱う時に改めて説明する。)
reduce-tree は、リストに対して呼び出されたファンクションの出力結果をリストにまとめて出力する。これは apply と同じである。例えば + を呼び出せば、リストの合計値が得られる。applyは2重以上の括弧に対応しておらずエラーが出るが、 reduce-tree は複数の括弧に対しても結果を出力できる。 それに対して apply は、ラムダファンクションを扱える。
group-list は、リストを指定した番号ずつの個数の値に割り振る。 例えば (1 2 3 4) に対して (1 3) を指定すると ((1) (2 3 4)) となる。左から3番目のインプット(input 2)はオプションで、linearまたはcircularが選べる。
remove は、リストの中から指定した値と一致するものを消去する。
remove-dup は、removeと同じくリストの中から指定した値と一致するものを消去するが、複数括弧のリストも扱えること、また eq (イコール、一致)だけでなく < や > などの論理演算子も扱える。
x-append は、2つ以上のリストの値を1つの括弧に収める。
list は、与えられたリストをさらに上部の括弧で囲んだリストを出力する。
interlock は、リストの値の間に新たな値を挿入する。
numerator は、素因数が整数で割り切れる場合に実数化する。割り切れない場合は最大の実数を返す。
permutations は、リストの並び替えの可能性を全て提示する。
subs-posn は、リストの中の指定されたn番目の値を新たな値に置き換える。
create-list は、与えられた数値またはリストを繰り返してリストを作る。 repeat-n と似た動作をするが、 repeat-n はリスト作成に限らず全てのオブジェクトを複数回evaluateする目的にも使える。
mapcar は、input 0に与えられたファンクション(またはラムダファンクション)を複数回実行するのに使う。例えばこの例では、listをファンクションとして与えることにより、input 1に(2 3 2 3)を、input 2に(5 10 15 20)を与えると、その結果は &niwiki(){((2 5) (3 10) (2 15) (3 20))} となる。これはつまり、input 1のリストの最初の値の2に対してinput 2のリストの最初の値の5が作用してlistにまとめられる。input 1のリストの2番目の値の3に対してinput 2のリストの2番目の値の10が作用してlistにまとめられる。これが繰り返される。
mapcan は、mapcarと同じように与えられたファンクション(またはラムダファンクション)を複数回実行するのに使うが、mapcarがそれぞれの結果を括弧でくくった複数括弧のリストを返すのに対し、mapcanはそれぞれの結果をフラットな数値としてまとめ、最後にリスト化する。ここでの出力結果は (2 5 3 10 2 15 3 20) となる。
これに対して + をファンクションとして与えた場合、mapcarは(7 13 17 23)という出力結果を返すが、mapcanはエラーとなる。これはそれぞれの出力結果が単体の数値となり、listにはならないためである。
mapcar については、以下も参照。
x-diff は、input 0に入力されたリストのうちinput 1に無い値を返す。
x-intersect は、input 0に入力されたリストのうちinput 1にもある値を返す。
x-union は、input 0に入力されたリストとinput 1のリストのうち、双方に無い値を補完する。双方にもある値は繰り返されない。
x-xor は、input 0に入力されたリストとinput 1のリストの排他的論理和(xor)を返す。
x->dx は、入力されたリストのそれぞれの値の間の差を返す。例えば (1 -2 5 7 13) と入力すると、(-3 7 2 6) が出力される。これは-2 - 1 = -3, 5 - -2 = 7 といった具合に、次の数値との差を求めているのである。
dx->x は、input 0に入力された値を基準とし、input 1に入力されたリストを順番に足していった数値を返す。例えばinput 0に 3 、input 1 に (1 -2 5 7 13) と入力すると、出力結果は (3 4 2 7 14 27) となる。これは 3 + 1 = 4, 4 + -2 = 2, 2 + 5 = 7 といった具合に、input 0の数値を起点として、次の数値との和を求めているのである。
x->dx と dx->x は、レトログラード(和音の反転、十二音技法の反行形)やインターポレーション(和音の各音程の相対的な変更)を行うのに重要なファンクションである。公式チュートリアルの以下も参照されたい。
range-filter は、リスト内の値をパスまたはリジェクトする。リストの特定の部分、例えば最初と最後の両端のみ必要、逆に両端のみ切り捨てるといった使い方に応用できる。
list-filter は、リスト内の値を論理演算子で判断し、t(真)の結果を返すものをパスまたはリジェクトする。ここではinput 0にnumberp(数値であればt)が指定されているので、input 1に(1 2 3 a b (1 2))を指定し、input 2にpassを指定した場合の出力結果は(1 2 3 (1 2))となる。
table-filter は、リストが複数括弧である場合、その2番目の括弧内の指定された値に対して論理演算子で判断し、t(真)の結果を返すものをパスまたはリジェクトする。ここではinput 0にoddp(奇数であればt)が指定されており、input 1に((1 2) (3 4) (6 7))が指定され、input 2に0(リストの0番目つまり最初の値)が指定されているので、(1 2)と(3 4)はそれぞれリストの最初の値が奇数なのでこれらがパスされ、(6 7)は最初の値が奇数ではないのでリジェクトされる。よって出力結果は((1 2) (3 4))となる。
expand-list は、指定された式によってリストを作成する。(3* (2 4) |0_8|)の出力結果は、(2 4)が3回繰り返されて(2 4 2 4 2 4)となり、さらに0_8は0から8までの数値を1ずつ順番に出力するので、結果は(2 4 2 4 2 4 0 1 2 3 4 5 6 7 8)となる。
1+ は、インプットされた数値に1を足して返す。
1- は、インプットされた数値に1を引いて返す。
- は、input 0の数値にinput 1以降の数値を足す。複数のインプットを使うことが出来る。入力は常に数値のみを受け付ける。
同様に、 -, *, / が使用可能である。
om+ は、インプットの数を増やすことは出来ないが、リストに対してまとめて数値を足すことが出来る。input 0, input 1の両方にリストを指定することも出来るが、その場合はどちらか少ない方のリストが終了した時点で、多い方のリストの残りは切り捨てられる。
同様に、om-. om*, om/ が使用可能である。
om/ は、割り切れない数を10/3として返す。これの少数を切り捨てるのが floor と om-round である。floor は小数点以下を全て切り捨てるが、om-round は>キーでオプションを表示し、小数点の数を指定することが出来る。8を指定した場合は 3.333333 となる。
om// は、剰余つまり「あまりの出る割り算」を返す。output 0からは商を、output 1からは剰余を返す。
om^ は、乗を返す。例えば2^4は16となる。
om-abs は、絶対値を返す。これは負の数から負を取り除いたものであり、例えば-10の絶対値は10である。リストでの指定も可能である。
sin, cos, tan は、それぞれサイン、コサイン、タンジェントを返す。
sqr は、二乗を返す。(平方根はsqrt)
sqrt は、平方根を返す。(二乗はsqr)
arithm-ser は、input 0からinput 1までの数をinput 2のステップで返す。
fibo-ser は、フィボナッチ数による数列を指定された数値以内で返す。
geometric-ser は、2の乗数を指定された数値以内で返す。
prime-ser は、素数を指定された数値以内で返す。
factorize は、指定された数の素因数分解を返す。
interpolation は、指定された2つの数の間の複数の数値を返す。
ここに挙げたファンクションは、よく使われるごく一部のものである。必要に応じてリファレンスマニュアルを参照して頂きたい。