参加・投票にはTwitterアカウントが必要です. 投票するかたは, 4つのお題のコードや解説をそれぞれ見て, 「普通」, 「良さそう」 の2択と「難解そう」で投票します. その投票の集計の結果で, 自作言語の優秀作を選びます.
Tweet
lang: Lit
creator: @uint256_t
creator: @uint256_t
GitHub: http://github.com/maekawatoshiki/lit-x86/tree/ast
ホームページ(未完成): http://maekawatoshiki.github.io/lit-homepage
Lit はRuby風の書き方が出来る言語です。今のところはRubyどころかCにも劣る言語ですが、唯一勝てる点があります。
それは速度です。Lit はJITコンパイルをするので、C並みの速度で実行することが出来ます。
いつかは、Ruby互換を目指したいです(いつになるのやら
ホームページ(未完成): http://maekawatoshiki.github.io/lit-homepage
Lit はRuby風の書き方が出来る言語です。今のところはRubyどころかCにも劣る言語ですが、唯一勝てる点があります。
それは速度です。Lit はJITコンパイルをするので、C並みの速度で実行することが出来ます。
いつかは、Ruby互換を目指したいです(いつになるのやら
hello world
square
fibonacci number
Editor!
lang: Lambia
creator: @phi16_
creator: @phi16_
* 申し訳ないですが「こうなるといいな~」というコードで、今は動かないです・・・(その内動くようにします(おそらく))
言語はこの辺です : https://github.com/phi16/Lambia
「読めるラムダ計算」を作りたくて作ったものです。型は無いです。全てのプログラムは零または唯一の実行行を持ちます。
見た感じPre.IOが万能ですが、その実Primitiveであるもの以外は全て簡単に自作が可能・・・になるはずです。
IO周りを特殊な値として保持し、それが評価されたタイミングで諸々を動かすようにしようかなとおもってます。Haskellから演算子を取り除いたような言語ですね。
とてもおおきな問題点として評価がめちゃくちゃ遅いです。この辺はNatなどのデータ構造を少しPrimitiveにすることで解決したいと考えています。
コードの解説 : 1.自明 2.BindはMonadのBindです 3.Wikipediaのアレ 4.Splitでどうにかします (全体的にHaskellが分かれば分かるかと思います)
言語はこの辺です : https://github.com/phi16/Lambia
「読めるラムダ計算」を作りたくて作ったものです。型は無いです。全てのプログラムは零または唯一の実行行を持ちます。
見た感じPre.IOが万能ですが、その実Primitiveであるもの以外は全て簡単に自作が可能・・・になるはずです。
IO周りを特殊な値として保持し、それが評価されたタイミングで諸々を動かすようにしようかなとおもってます。Haskellから演算子を取り除いたような言語ですね。
とてもおおきな問題点として評価がめちゃくちゃ遅いです。この辺はNatなどのデータ構造を少しPrimitiveにすることで解決したいと考えています。
コードの解説 : 1.自明 2.BindはMonadのBindです 3.Wikipediaのアレ 4.Splitでどうにかします (全体的にHaskellが分かれば分かるかと思います)
hello world
square
fibonacci number
Editor!
lang: PSL
creator: @P9Silica
creator: @P9Silica
https://github.com/Silica/PSL
ゲームから呼び出す為に作った組み込みスクリプト言語
Cで書かれたLuaと比べると値の受け渡しや相互の関数呼び出しが非常に簡単に行えます.
言語としては何となくオブジェクト指向っぽいものを持つ動的型付け言語です.
各解説
・hello world
関数呼び出しはC言語同様()でも可能なのですが関数適用演算子`(バッククオート)も存在しています.
・square
文字列に対して乗算 * 演算子を適用すると文字列を繰り返します.
0の時も元の文字列は残るので0が入力された時も要件に入るなら普通にループを書きます.
・fibonacci number
愚直な再帰で書くとそれなりに遅いです.
ループを回して多重代入を利用して簡潔に記述しています.
値の交換も a, b = b, a; で可能です.
・Editor!
なんで1番目からなんですか.
文字列に対して / や % 演算すると切り取ります.
str / n で前からn文字を残す
str % n で前からn文字を削って後ろを残す
使っていませんが - は後ろからn文字削ります
ゲームから呼び出す為に作った組み込みスクリプト言語
Cで書かれたLuaと比べると値の受け渡しや相互の関数呼び出しが非常に簡単に行えます.
言語としては何となくオブジェクト指向っぽいものを持つ動的型付け言語です.
各解説
・hello world
関数呼び出しはC言語同様()でも可能なのですが関数適用演算子`(バッククオート)も存在しています.
・square
文字列に対して乗算 * 演算子を適用すると文字列を繰り返します.
0の時も元の文字列は残るので0が入力された時も要件に入るなら普通にループを書きます.
・fibonacci number
愚直な再帰で書くとそれなりに遅いです.
ループを回して多重代入を利用して簡潔に記述しています.
値の交換も a, b = b, a; で可能です.
・Editor!
なんで1番目からなんですか.
文字列に対して / や % 演算すると切り取ります.
str / n で前からn文字を残す
str % n で前からn文字を削って後ろを残す
使っていませんが - は後ろからn文字削ります
hello world
square
fibonacci number
Editor!
lang: T言語
creator: @h_sakurai
creator: @h_sakurai
T言語 [1] はPrologで実装がたった200行の型推論付き関数型言語です。T言語はFlops 2016のTIPER [2] に大きな影響を受けています。
型理論の論文で用いられる推論規則は論理型言語なのでPrologを用い論文の記法に出来るだけ近付けて実装しました。
[1] http://github.com/hsk/t/ [2] http://slides.com/kyagrd/tiper-flops2016
## hello world
通常のML系の言語は括弧を書かずに引数を渡す事が出来ます。
C言語系統の言語ではadd(1,2)と書く所をOCaml等ではadd 1 2と記述出来ます。
しかし、Prologでは残念ながらこのように書く事は出来ません。そこで、add $ 1 $ 2のように記述します。
Hello worldのプログラム:
println_string $ "hello world!"
は、println_string関数に"hello world!"文字列を引き渡して関数適用しています。
## square
T言語ではリストデータとしてargvにコマンドライン引数が渡されてきます。
パターンマッチにより引数を取得します。
T言語のパターンマッチはCoPLのEvalML4相当の単純なパターンマッチなので複雑な事は出来ないためこのような実装になっています。
write_sharp関数が#を1行出力します。
write_sharp_line関数が複数行出力します。
int_of_stringは文字列からint値に変換する関数です。
## fibonacci number
fibは単純に再帰的に呼び出しています。高速化する気はないのでfib(40)だといつ帰ってくるか分からない程時間がかかります。
## Editor!
squareのようなやり方で引数を複数受け取るのはさすがに大変です。
そこで引数受け取り関数nthを作成しました。
nth関数はListのn番目の値を取得します。
insert関数で指定箇所に文字を加えます。
remove関数で指定箇所の文字を削除します。
あとはそれぞれの関数を呼び出すだけです。
型理論の論文で用いられる推論規則は論理型言語なのでPrologを用い論文の記法に出来るだけ近付けて実装しました。
[1] http://github.com/hsk/t/ [2] http://slides.com/kyagrd/tiper-flops2016
## hello world
通常のML系の言語は括弧を書かずに引数を渡す事が出来ます。
C言語系統の言語ではadd(1,2)と書く所をOCaml等ではadd 1 2と記述出来ます。
しかし、Prologでは残念ながらこのように書く事は出来ません。そこで、add $ 1 $ 2のように記述します。
Hello worldのプログラム:
println_string $ "hello world!"
は、println_string関数に"hello world!"文字列を引き渡して関数適用しています。
## square
T言語ではリストデータとしてargvにコマンドライン引数が渡されてきます。
パターンマッチにより引数を取得します。
T言語のパターンマッチはCoPLのEvalML4相当の単純なパターンマッチなので複雑な事は出来ないためこのような実装になっています。
write_sharp関数が#を1行出力します。
write_sharp_line関数が複数行出力します。
int_of_stringは文字列からint値に変換する関数です。
## fibonacci number
fibは単純に再帰的に呼び出しています。高速化する気はないのでfib(40)だといつ帰ってくるか分からない程時間がかかります。
## Editor!
squareのようなやり方で引数を複数受け取るのはさすがに大変です。
そこで引数受け取り関数nthを作成しました。
nth関数はListのn番目の値を取得します。
insert関数で指定箇所に文字を加えます。
remove関数で指定箇所の文字を削除します。
あとはそれぞれの関数を呼び出すだけです。
hello world
square
fibonacci number
Editor!
lang: Shiranui
creator: @Tomoki_Imai
creator: @Tomoki_Imai
Shiranui はテストと統合したライブプログラミング環境です.
ライブプログラミング環境とは,書いたプログラムのフィードバックがすぐに得られるような開発環境のことです.
コードだけではわかりづらいので,以下に今回の問題を解いてみた動画があります.
- https://www.youtube.com/watch?v=BDWqy6aPX2Q
- http://www.nicovideo.jp/watch/sm28515042
github は以下
https://github.com/tomoki/Shiranui
論文も一応あります. (abstract ですが)
- http://dl.acm.org/citation.cfm?id=2817268
- http://dl.acm.org/citation.cfm?id=2814193
1. hello world
#- からはじまる行はテストコードです.
\(){} は関数オブジェクトです.
2. square
repは,文字列を複数回連結するプログラムです.
内部は簡単な再帰です.
それを使えばsquareも容易に記述できます.
ここでのポイントは関数の中の関数もテストすることができることです.
Shiranui はクロージャを表現する特別な記法があります.
例えば, <|a=$(sq->a,wall->"###")s|> の意味は,
sqが'a',wallが"###"となっている環境でのラムダ式sから生成される関数オブジェクトです.
(ただし,'a' は自己参照)
3. fibonacci number
残念ながら,fib(40)は Shiranui ではスタックオーバーフローします.
ここでは,メモ化再帰を使うことでそれを回避しています.
特徴は,[0 .. 3) という記法で,これは [0, 1, 2] となります.
数学の半開区間をそのまま表現できます.
4. Editor!
ここでは ref というあたらしいものがあります.
ref は OCaml からもってきたもので,あたらしい箱を作ります.
Shiranui の特徴のおかげで,たくさんのユニットテストを作成することができました.
ライブプログラミング環境とは,書いたプログラムのフィードバックがすぐに得られるような開発環境のことです.
コードだけではわかりづらいので,以下に今回の問題を解いてみた動画があります.
- https://www.youtube.com/watch?v=BDWqy6aPX2Q
- http://www.nicovideo.jp/watch/sm28515042
github は以下
https://github.com/tomoki/Shiranui
論文も一応あります. (abstract ですが)
- http://dl.acm.org/citation.cfm?id=2817268
- http://dl.acm.org/citation.cfm?id=2814193
1. hello world
#- からはじまる行はテストコードです.
\(){} は関数オブジェクトです.
2. square
repは,文字列を複数回連結するプログラムです.
内部は簡単な再帰です.
それを使えばsquareも容易に記述できます.
ここでのポイントは関数の中の関数もテストすることができることです.
Shiranui はクロージャを表現する特別な記法があります.
例えば, <|a=$(sq->a,wall->"###")s|> の意味は,
sqが'a',wallが"###"となっている環境でのラムダ式sから生成される関数オブジェクトです.
(ただし,'a' は自己参照)
3. fibonacci number
残念ながら,fib(40)は Shiranui ではスタックオーバーフローします.
ここでは,メモ化再帰を使うことでそれを回避しています.
特徴は,[0 .. 3) という記法で,これは [0, 1, 2] となります.
数学の半開区間をそのまま表現できます.
4. Editor!
ここでは ref というあたらしいものがあります.
ref は OCaml からもってきたもので,あたらしい箱を作ります.
Shiranui の特徴のおかげで,たくさんのユニットテストを作成することができました.
hello world
square
fibonacci number
Editor!
lang: XASH
creator: @long_long_float
creator: @long_long_float
Github: https://github.com/long-long-float/xash
Rubygems: https://rubygems.org/gems/xash
XASH(eXecutable hASH)はYamlなどのkey-valueなデータ形式で記述できるプログラミング言語です。詳しくは https://github.com/long-long-float/xash/wiki/Document をご覧ください。
この言語はRubyで書かれているので動かしたい方は
gem install xash
でインストールすれば、
xash FILE
で実行できます。
* hello world
XASHは評価した値をそのまま出力するので単に"hello world"と書くだけで出力されます(ずるい?)
* square
XASHではforは式で評価した値をまとめるので(map関数みたいなもの)、HとWだけforを回してその中で#を返すだけで欲しい出力が得られます。あとはこれをjoinすれば四角形が出力されます。
あと、XASHでは入力が出来ないのでHとWを直接書いています。
* fibonacci number
expr: [...] で計算式を評価できます。見難いですね。また、key-valueな変数が使えないのでメモ化なんて出来ませんでした。
* Editor!
XASHでは配列を直接書き換える関数は用意されていないので、head, tail, consで関数型言語っぽく書いてみました(実際Haskellで下書きしてからこっちに移植した)。
Rubygems: https://rubygems.org/gems/xash
XASH(eXecutable hASH)はYamlなどのkey-valueなデータ形式で記述できるプログラミング言語です。詳しくは https://github.com/long-long-float/xash/wiki/Document をご覧ください。
この言語はRubyで書かれているので動かしたい方は
gem install xash
でインストールすれば、
xash FILE
で実行できます。
* hello world
XASHは評価した値をそのまま出力するので単に"hello world"と書くだけで出力されます(ずるい?)
* square
XASHではforは式で評価した値をまとめるので(map関数みたいなもの)、HとWだけforを回してその中で#を返すだけで欲しい出力が得られます。あとはこれをjoinすれば四角形が出力されます。
あと、XASHでは入力が出来ないのでHとWを直接書いています。
* fibonacci number
expr: [...] で計算式を評価できます。見難いですね。また、key-valueな変数が使えないのでメモ化なんて出来ませんでした。
* Editor!
XASHでは配列を直接書き換える関数は用意されていないので、head, tail, consで関数型言語っぽく書いてみました(実際Haskellで下書きしてからこっちに移植した)。
hello world
square
fibonacci number
Editor!
lang: Twintail(仮)
creator: @GnicoGplus
creator: @GnicoGplus
Twintailは”まるちぱらだいむ”な言語で,入力コードをILに変換します.そのため,コンパイル・実行には,.Net Frameworkが必要です.
各問題には,ILに出力した後は,こんな感じになるだろうっていうコードを載せてます.まだ完成していないので,理想です.
"#set non-obejected"により,手続き型言語風の書き方ができます.
*言語概要*
マクロが定義できたり,関数型プログラミングもどきができたりします.そんだけです.
目標は,Nemerleのマクロ機能をもう少し使いやすくしようって言う感じです.
*Hello World*
System.Console.WriteLine(System.String)を使って出力しています.
*Square*
ReadFormatは,一見関数に見えますが,マクロです.IL出力後は"ReadFormat"というのが一字一句も無いのがわかるでしょうか.
ReadFormatマクロ(完全名:Twintail.Console.ReadFormat(<Immutable>System.String) : TwintailExp)は,コンパイル時に,渡された値によって,一つの匿名的な静的関数をその使われているクラス上に展開します.その中で,色々します.コンパイル時に決まる文字列でないと受け付けないので注意してください.また,"string string"といった事はできません.
"loop"も標準構文の様に見えますが,これもマクロです.コンパイル時に,for文に変換されます.このように,新たなSyntaxも定義できちゃいます.ほぼ完全にNemerleのパク(ゲフンゲフン
catch { _ => ...}っていうのがあるように,関数型の皮被ってますが,不純なので気をつけてください.
*Fibonacci Number*
[Memorise]はマクロです.|>はパイプライン演算子です(F#からのパクリです)
def ほにゃらら(引数) で匿名関数が作られます.型推論できるようにコンパイラをつくるつもりなので,型名などは書いてません.
*Editor!*
Squareと基本的に同じです.
各問題には,ILに出力した後は,こんな感じになるだろうっていうコードを載せてます.まだ完成していないので,理想です.
"#set non-obejected"により,手続き型言語風の書き方ができます.
*言語概要*
マクロが定義できたり,関数型プログラミングもどきができたりします.そんだけです.
目標は,Nemerleのマクロ機能をもう少し使いやすくしようって言う感じです.
*Hello World*
System.Console.WriteLine(System.String)を使って出力しています.
*Square*
ReadFormatは,一見関数に見えますが,マクロです.IL出力後は"ReadFormat"というのが一字一句も無いのがわかるでしょうか.
ReadFormatマクロ(完全名:Twintail.Console.ReadFormat(<Immutable>System.String) : TwintailExp)は,コンパイル時に,渡された値によって,一つの匿名的な静的関数をその使われているクラス上に展開します.その中で,色々します.コンパイル時に決まる文字列でないと受け付けないので注意してください.また,"string string"といった事はできません.
"loop"も標準構文の様に見えますが,これもマクロです.コンパイル時に,for文に変換されます.このように,新たなSyntaxも定義できちゃいます.ほぼ完全にNemerleのパク(ゲフンゲフン
catch { _ => ...}っていうのがあるように,関数型の皮被ってますが,不純なので気をつけてください.
*Fibonacci Number*
[Memorise]はマクロです.|>はパイプライン演算子です(F#からのパクリです)
def ほにゃらら(引数) で匿名関数が作られます.型推論できるようにコンパイラをつくるつもりなので,型名などは書いてません.
*Editor!*
Squareと基本的に同じです.
hello world
square
fibonacci number
Editor!
lang: hexe
creator: @hum_op
creator: @hum_op
hexe言語にはメイン関数はなく, いきなりコードを書くことができます.
hexe言語では, 1次元配列をサポートしています.
行末はセミコロンで表すことができますが, これは省略することができます. ただ, fibonacci number問題での3行目のように1行に複数の命令を書いた場合明示的にセミコロンを書く必要が有ります.
関数や変数の宣言は, set を使用し, 変数には$をつけそれ以外は関数として扱います.
変数への値の割り当ては << を使用します.
hexe言語では, whileやforのような繰り返し処理をサポートしていません. そのため, init関数のようにして繰り返し処理を行います.
四則演算子 と他の演算子
+ 和
- 差
* 積
/ 商
% 剰余
^ べき乗
比較演算子
hexe言語では, 以下の比較演算子を使用することができます.
= 左辺と右辺は等しい
<> 左辺と右辺は等しくない
< 左辺は右辺より小さい
<= 左辺は右辺以下
> 左辺は右辺より大きい
>= 左辺は右辺以上
★hello world問題
printというビルトイン関数で文字列を表示します.
print 文字列
★square問題
getvというビルトイン関数で数値を入力します.getvはget valueの意です.
そして, 再帰関数を用いてループをし井桁を入力された幅と高さ通りに表示します.
★fibonacci number問題
メモ化再帰によってフィボナッチ数を求めています.
★Editor!問題
言語仕様により実装不可(対応させたい)
hexe言語では, 1次元配列をサポートしています.
行末はセミコロンで表すことができますが, これは省略することができます. ただ, fibonacci number問題での3行目のように1行に複数の命令を書いた場合明示的にセミコロンを書く必要が有ります.
関数や変数の宣言は, set を使用し, 変数には$をつけそれ以外は関数として扱います.
変数への値の割り当ては << を使用します.
hexe言語では, whileやforのような繰り返し処理をサポートしていません. そのため, init関数のようにして繰り返し処理を行います.
四則演算子 と他の演算子
+ 和
- 差
* 積
/ 商
% 剰余
^ べき乗
比較演算子
hexe言語では, 以下の比較演算子を使用することができます.
= 左辺と右辺は等しい
<> 左辺と右辺は等しくない
< 左辺は右辺より小さい
<= 左辺は右辺以下
> 左辺は右辺より大きい
>= 左辺は右辺以上
★hello world問題
printというビルトイン関数で文字列を表示します.
print 文字列
★square問題
getvというビルトイン関数で数値を入力します.getvはget valueの意です.
そして, 再帰関数を用いてループをし井桁を入力された幅と高さ通りに表示します.
★fibonacci number問題
メモ化再帰によってフィボナッチ数を求めています.
★Editor!問題
言語仕様により実装不可(対応させたい)
hello world
square
fibonacci number
Editor!
lang: Logical
creator: @Twi_Stamp
creator: @Twi_Stamp
http://pitto.exout.net/Logical/explain.html
hello world
square
fibonacci number
Editor!