ログイン
編集不可のページディスカッション情報添付ファイル
"moba/Koka"の差分

MMA
2と3のリビジョン間の差分
2015-11-11 23:20:06時点のリビジョン2
サイズ: 1113
編集者: moba
コメント:
2015-11-12 00:18:35時点のリビジョン3
サイズ: 4250
編集者: moba
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 5: 行 5:
Kokaは副作用を伴う計算から純粋な値を分離したfunction-oriented(関数指向?)な言語です('効果'の意味は英語でいうところの"effect"や"effective"です)。Kokaは柔軟で、ラージスケールなプログラムにおいてもデータの型の変更を容易にし、コードを正しくまとめる手助けを行うような機能を豊富に持っていて、JavaScriptに似た文法で小さな強い型付けを言語機能として持っています "Koka"は副作用を伴う計算から純粋な値を分離した''function-oriented''(関数指向?)な言語です('効果'の意味は英語でいうところの"effect"や"effective"です)。Kokaは柔軟で、ラージスケールなプログラムにおいてもデータの型の変更を容易にし、コードを正しくまとめる手助けを行うような機能を豊富に持っていて、JavaScriptに似た文法で小さな強い型付けを言語機能として持っています
行 12: 行 12:
{{{#!wiki
<#FF0000> red

{{{#!highlight javascript
function main()
{
  println("Hello World!") //println output
}
行 15: 行 19:

関数は'''function'''か'''fun'''キーワードを使うことで定義されます。慣習的には'''function'''キーワードはトップレベルに対して、'''fun'''キーワードは無名関数に対して使用されます

== シーザー暗号化 ==
ここでは文字列をシーザー暗号によって文字列中の小文字をアルファベットで3つだけ大きい方向に置き換える短いプログラム例を示します

{{{#!highlight javascript
function encode( s : string, shift : int )
{
  fun encodeChar(c) {
    if (c < 'a' || c 'z') return c
    base = (c - 'a').int
    rot = (base + shift) % 26
    return (rot.char + 'a')
  }

  s.amp(encodeChar)
}

function caesar( s : string ) : string
{
  s.enmcode( 3 )
}
}}}

この例では、''encodeChar''という1文字を受け取り、エンコードするローカル関数を定義しています。最後の文では''s.map(encodeChar)''のように、''encodeChar''関数をstring型な''s''内の文字に対してそれぞれ適用し、シーザー暗号化された新しい文字列を返しています。関数内の最終文の結果も関数の値として返されますが、ふつうは明示的に'''return'''キーワードで関数を抜けます

このサンプルでは各文の終わりのセミコロンや定義がないことが見て取れます。"Koka"に文にセミコロンを自動で追加させたり、ブレース("{"と"}"のことです)の間で整理された形で定義を自動で入れさせたりすることでシンプルなレイアウト規則を使うことができます。長い文はさらにインデントを使うことで次の行に記述することができます。もちろん、必要であれば1行に複数の文を記述するなどのようにいつでもセミコロンを入れることができます

"Koka"は(例のオブジェクトとは対照的に)関数やデータを言語のコアから生成するような''function-oriented''な言語です。特に、''s.encode(3)''という式はstring型のオブジェクトから''encode''メソッドが選ばれているわけではなく、''s''が最初の引数となる''encode(s,3)''のような関数呼び出しの単純な糖衣構文です。同じように、''c.int''は''int(c)''を呼ぶことで文字を整数に変換しています(どちらの式も同値です)。ドット記法は
{{{#!highlight javascript
fun showit( s : string ) = s.encode(3).length.println
}}}
のように複数の呼び出しをまとめてチェインすることができ、直感的で非常に便利なものです。この例ではこの式は'''println(length(encode(s, 3)))'''に解釈されます。関数呼び出しの糖衣構文としてのドット記法の利便性はちょうど第1引数として型をとるような新しい関数を書くように、任意のデータ型をとる"組み込み"関数の拡張を簡単にするところです。ほとんどのオブジェクト指向言語は

Kokaチュートリアルの適当日本語訳

これはC/C++やC#、JavaScriptなどのプログラマのためのKokaプログラミング言語の短い紹介文です

"Koka"は副作用を伴う計算から純粋な値を分離したfunction-oriented(関数指向?)な言語です('効果'の意味は英語でいうところの"effect"や"effective"です)。Kokaは柔軟で、ラージスケールなプログラムにおいてもデータの型の変更を容易にし、コードを正しくまとめる手助けを行うような機能を豊富に持っていて、JavaScriptに似た文法で小さな強い型付けを言語機能として持っています

より多くの背景情報が必要な場合はKoka research pageやLang.(2012/8)で発表した際のスライドを見てください

Hello world

慣習に倣って、まずはHello worldプログラムから始めましょう

   1 function main()
   2 {
   3   println("Hello World!") //println output
   4 }

関数はfunctionfunキーワードを使うことで定義されます。慣習的にはfunctionキーワードはトップレベルに対して、funキーワードは無名関数に対して使用されます

シーザー暗号化

ここでは文字列をシーザー暗号によって文字列中の小文字をアルファベットで3つだけ大きい方向に置き換える短いプログラム例を示します

   1 function encode( s : string, shift : int )
   2 {
   3   fun encodeChar(c) {
   4     if (c < 'a' || c 'z') return c
   5     base = (c - 'a').int
   6     rot  = (base + shift) % 26
   7     return (rot.char + 'a')
   8   }
   9 
  10   s.amp(encodeChar)
  11 }
  12 
  13 function caesar( s : string ) : string
  14 {
  15   s.enmcode( 3 )
  16 }

この例では、encodeCharという1文字を受け取り、エンコードするローカル関数を定義しています。最後の文ではs.map(encodeChar)のように、encodeChar関数をstring型なs内の文字に対してそれぞれ適用し、シーザー暗号化された新しい文字列を返しています。関数内の最終文の結果も関数の値として返されますが、ふつうは明示的にreturnキーワードで関数を抜けます

このサンプルでは各文の終わりのセミコロンや定義がないことが見て取れます。"Koka"に文にセミコロンを自動で追加させたり、ブレース("{"と"}"のことです)の間で整理された形で定義を自動で入れさせたりすることでシンプルなレイアウト規則を使うことができます。長い文はさらにインデントを使うことで次の行に記述することができます。もちろん、必要であれば1行に複数の文を記述するなどのようにいつでもセミコロンを入れることができます

"Koka"は(例のオブジェクトとは対照的に)関数やデータを言語のコアから生成するようなfunction-orientedな言語です。特に、s.encode(3)という式はstring型のオブジェクトからencodeメソッドが選ばれているわけではなく、sが最初の引数となるencode(s,3)のような関数呼び出しの単純な糖衣構文です。同じように、c.intint(c)を呼ぶことで文字を整数に変換しています(どちらの式も同値です)。ドット記法は

   1 fun showit( s : string ) = s.encode(3).length.println

のように複数の呼び出しをまとめてチェインすることができ、直感的で非常に便利なものです。この例ではこの式はprintln(length(encode(s, 3)))に解釈されます。関数呼び出しの糖衣構文としてのドット記法の利便性はちょうど第1引数として型をとるような新しい関数を書くように、任意のデータ型をとる"組み込み"関数の拡張を簡単にするところです。ほとんどのオブジェクト指向言語は

moba/Koka (最終更新日時 2015-11-19 14:59:25 更新者 moba)