プログラミング言語 Cyan の紹介
Cyan ってどんな言語?
●

プログラミング言語 Cyan
http://www.geocities.jp/takt0_h/cyan/
2008 年 U-20 プログラミングコンテストで受
賞

●

http://www.jipdec.or.jp/archives/project/procon/work/2
当時高校2年の学生が作成
国産言語
どんな言語
既存の普及した言語で例えるなら
●

Object 指向 CommonLisp

●

マクロ付 Ruby

●

プロトタイプオグジェクト指向 Ruby
こんなカンジで例えると最初の取っ掛かりを
つかみやすい言語です
基本的な文法
●

●

実際に文法を”ざらっと”見て行きましょう
コメント
# 「#」から行末がコメントです
データ構造

●

1 # 整数

●

"Hello,Cyan!!" # 文字列
基本的な構文
●
●

[1, 2, 3 ,4] # リスト
%{ "Mt. Fuji" => "Shizuoka", "Mt. Aso" =>
"Kumamoto" } # ハッシュ

{ say(“HELLO”); } # ブロック
^(x) { say(x); } #  ラムダ
LL 言語使いなら見慣れた書式に近いのが分か
る
基本的な構文
●

# 関数呼び出し
say "Hello,World!" # 括弧 () は省略可能
# if 文
if( false ){
say "true"
} else {
say "false`"
}
基本的な構文
# while 文
i=0
while(i<5) {
say i
i++
}
基本的な構文
# Python 風のインデントでも記述できます
while(i<10):
say i
i++
if( false ):
say "true"
else:
say "false`"
基本的な構文、メソッド定義
●

# Prototype オブジェクト指向で JS 使いの感
覚に訴える書式です
# Object を継承した Human を作成

●

Human = Object.child()
Human.walk = ^(self, dir){
say(self.name + " walked " + dir + ".")
}
基本的な構文
●

引数クラスと引数展開
say &(1, *[2, 3], *%{ 'a => 4 }, *&(5, :b 6)) #=>
&(1, 2, 3, 5, :a 4, :b 6)

●
●

●

「 * 」で配列を展開して受け取る
引数の末尾では {} を省略してハッシュを渡
せる
「 & 」は " 引数オブジェクト " の定義記号
JS と Ruby 両方の合わせ技なカンジです
Cyan の特徴1(マクロの存在)
●

ここまでは多分似たような機構を他の言語で
触れている
この言語、マクロがちゃんとあるのが特徴
マクロの基本構文
準クォート「 ` 」の中で「 ? 」付けた変数は
展開されてプログラム中に埋め込まれる
recv = 2
args = &({ say "meow" })
# 2.times({ say("meow") }) という式を表示
say `(?recv).times(?*args)
マクロの使い道
実際にはどういう場面で役に立つのか?
# 例: cyan 本体に組み込まれているアナ
フォリックマクロ
aif( 10 ){
say it # 10 が表示される
}
# これとだいたい等価
if( it = 10 ){
say it
}
マクロの解説
実際にはこんなカンジで定義されています
mac(aif)^(cond, then, &key else):
`if(it := ?cond, ?then, :else ?else)
マクロを使うと関数定義では出来ない構文の
拡張が可能
これが第一の特徴
Cyan の特徴 2 メソッド編
●

List に定義されているメソッドを見る
http://www.geocities.jp/takt0_h/cyan/doc/ref/objects/lis
中身 :
car()
self の car を返します。
cdr()
self の cdr を返します。
car と cdr しか定義されていない!!
List.cy 探訪
●

その他のメソッドの定義は、初期化ファイル
群の中の list.cy にある
# Ruby の Array#each 相当のメソッド
def(List.foreach)^(fn):
unless(.null?()):
fn(.car())
.cdr().foreach(fn)
List#foreach の実行
書いて試してみる
[1,2,3].foreach ^(i){ say i; } # 1 〜 3 を表示
動いた!
他にも List#map や List#fold 等も定義されて
います
ほとんどのメソッドが cyan 自体で記述され
ている
Object.cy の中身
●

他にも object.cy のファイル名があるので中
を見てみる
def(Object.init)^{}
def(Object.new)^(&args args):
obj := .child()
obj.init(*args)
obj
オブジェクトの定義そのものがマクロ
while マクロ探訪
# control.cy
mac(while)^(test, body):
`loop:
if(!?test): break()
begin(?body)
実は while 文自体マクロ、 for 文もマクロ
なので unless 文なども if から作成可能
Cyan 全体の総論
総論:
Cyan という言語は
必要最小限のオブジェクトと構文のみを
Cyan 本体で定義して、その他の構文やメ
ソッドは Cyan 自体で書いてしまうという戦
略を取っている。
これは Cyan の美しさでありパワー
Cyan の欠点
●

●

●

先ほど出したように List#foreach からして再
帰構文
再帰する度にスタックに状態を溜める→メモ
リにやさしくない
Cyan のパフォーマンスを計ってみ
る
●

http://tanakahisateru.hatenablog.jp/entry/20081226/123
Ruby に対して 1/650

●

Scheme に対して 1/2000

●

Python に対して 1/6500

●

Scala に至っては 1/26000!
再帰構文が多用されるアルゴリズムでは破滅
的な速度低下を引き起こす
Cyan の欠点2
●
●

●

●

コンソールが死ぬほど使えない
「←」キーを打っても、キャレットが移動し
ない ( それどころか“ read error:” になる )
同じくコンソールで「↑↓」を押しても履歴
を見ない
「 delete 」キーでキャレットが謎のワープを
する事がある
Cyan の欠点 3
●

If 文で謎のインデントを強いられる
if( false ):
say "true"
else: # else が1文字インデントしている
say "false`"
インデントしないと変数と勘違いして
「 error: unbound variable: else 」
正直我慢できる程度に慣れる事はあっても、
生涯に渡って好きにならない自信がある
欠点総論
●

構文の最適化やコンソールなど、普通に作れ
ば解決できるはずの箇所の実装が全くなされ
ていない
Cyan 総論 1
Cyan 自体が生み出した新規の概念などは見
当たらないが他の言語の強力な書式をバラン
スよくまとめてある
Lisp の様に、今記述している問題を、関数や
マクロに切り出して、”対象の本質とは何
か”を切り出す力強さを持っている
Cyan=( 思案 ) という言語の名前の由来の一つ
でもある
Cyan 総論 2
●

●

●

実行速度やツール面などの作りこみが足りて
いない、そのまま放置されている
本体は、末尾再帰の最適化、 compile メソッド
等の速度改善が必要
これに単体テストフレームワークや .Net ライ
ブラリの簡潔な呼び出しなどの周辺ライブラ
リの整備いる、足りないので産業界に受け入
れられなかった、一言で言うと”残念な美人”
最後に
●

●

国産ですし、可能性のある言語なのでもう少
し評価されていいと思ってプレゼンしました
作者さん、次の言語作るならそれはそれでい
いので、今度は産業界に受け入れられるだけ
のものを待っています!!
以上、ありがとうございました!!

More Related Content

PDF
Swift を振り返ってみよう #cswift
PDF
nomlab_okayamaruby_slide
PDF
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
PDF
JavaScript経験者のためのGo言語入門
PDF
nomlab_okayamaruby_subslide
PDF
Swift の可変値と不変値 #cocoa_kansai
PDF
Kotlinアンチパターン
PDF
Kotlinミニアンチパターン
Swift を振り返ってみよう #cswift
nomlab_okayamaruby_slide
Kanrk05 .Netでお仕事しているプログラマがスクリプト言語として使うRuby
JavaScript経験者のためのGo言語入門
nomlab_okayamaruby_subslide
Swift の可変値と不変値 #cocoa_kansai
Kotlinアンチパターン
Kotlinミニアンチパターン

What's hot (20)

PDF
Students.rb #1 資料
PDF
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
PDF
Refactoring point of Kotlin application
PDF
Kotlinの紹介
PDF
Rubyistのためのkotlin紹介
PDF
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
PPTX
コードに基づくモデルによる IntelliCode
PDF
TechDo Goハンズオン#3
PDF
リテラルと型の続きの話 #__swift__
PDF
詳解! Decimal
PPTX
Vs2019 を試してみる会
PDF
プリキュアのRuby実装の紹介 #RubyHiroba
PDF
First step of Rails Contribute‎ #shibuyarb
PDF
で、次は何がくるの? - 第2回 TIS Matsuri
PDF
Rubyでプリキュアを作った #cure_advent #shibuyarb
PDF
20130615 組込みの仕事場でRubyを使う
PDF
Rubyist started to learn Groovy - things important to leran new LL
PDF
TypeScript & 関数型講座 第2回 TypeScript という言語
PPTX
C++ tips1 #include編
PDF
C++ tips2 インクリメント編
Students.rb #1 資料
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
Refactoring point of Kotlin application
Kotlinの紹介
Rubyistのためのkotlin紹介
プログラミング言語 Ruby 2章 Rubyプログラムの構造と実行
コードに基づくモデルによる IntelliCode
TechDo Goハンズオン#3
リテラルと型の続きの話 #__swift__
詳解! Decimal
Vs2019 を試してみる会
プリキュアのRuby実装の紹介 #RubyHiroba
First step of Rails Contribute‎ #shibuyarb
で、次は何がくるの? - 第2回 TIS Matsuri
Rubyでプリキュアを作った #cure_advent #shibuyarb
20130615 組込みの仕事場でRubyを使う
Rubyist started to learn Groovy - things important to leran new LL
TypeScript & 関数型講座 第2回 TypeScript という言語
C++ tips1 #include編
C++ tips2 インクリメント編
Ad

Similar to プログラミング言語Cyanの紹介 (20)

PDF
2011年10月21日
PPTX
Ruby講座一回目
PDF
about Perl5.10
PPTX
Ruby講座一回目
PPT
Start!! Ruby
PDF
Ruby で学ぶプログラミング入門
PDF
Rubyとプログラミング言語の潮流
PDF
Ruby紹介(pdf)
PDF
ODP
プログラミング言語Ruby 1章 イントロダクション
ODP
Introduction of Python
PDF
PHPer のための Ruby 教室
PDF
30分で作ってRubyを体感資料
PDF
メタメタプログラミングRuby
ODP
Rubyのソースコードを読んでみよう(入門編)
PPT
Lightning introduction to CoffeeScript 20131005
PDF
ruby for_if_while
PDF
並行プログラミングと継続モナド
KEY
Rails基礎講座 part.1
PDF
Ruby紹介3(pdf)
2011年10月21日
Ruby講座一回目
about Perl5.10
Ruby講座一回目
Start!! Ruby
Ruby で学ぶプログラミング入門
Rubyとプログラミング言語の潮流
Ruby紹介(pdf)
プログラミング言語Ruby 1章 イントロダクション
Introduction of Python
PHPer のための Ruby 教室
30分で作ってRubyを体感資料
メタメタプログラミングRuby
Rubyのソースコードを読んでみよう(入門編)
Lightning introduction to CoffeeScript 20131005
ruby for_if_while
並行プログラミングと継続モナド
Rails基礎講座 part.1
Ruby紹介3(pdf)
Ad

More from baban ba-n (11)

ODP
Typusとadministrateを比較してみよう
ODP
Typusと付き合ってきた話
ODP
ハッカソン。来た、見た、負けた! Spajam2016仙台予選
ODP
ガラホ、なるものに対応してきた
ODP
Minitest調べてみた
ODP
人工言語ロジバン超入門編
ODP
普通のエンジニアが【ロジバン】やってみた
ODP
Rubyのコードを読んでみよう(オブジェクト編)
ODP
rails 管理画面作成gem Typus解説
PDF
名前重要 超重要
ODP
Rails-Plugin Flexturesの紹介
Typusとadministrateを比較してみよう
Typusと付き合ってきた話
ハッカソン。来た、見た、負けた! Spajam2016仙台予選
ガラホ、なるものに対応してきた
Minitest調べてみた
人工言語ロジバン超入門編
普通のエンジニアが【ロジバン】やってみた
Rubyのコードを読んでみよう(オブジェクト編)
rails 管理画面作成gem Typus解説
名前重要 超重要
Rails-Plugin Flexturesの紹介

プログラミング言語Cyanの紹介

Editor's Notes