feature image

2018年12月1日 | ブログ記事

????Emojicodeはエモい?❗?

この記事は traP Advent Calendar 2018 38日目の記事です。

こんにちは,Double_oxygeNです。世間的には今日がAdvent Calendar 1日目ですね。traPでは37日も前からクリスマス?を楽しみにしていることになりますが,クリスマスにtraPで何かあるのでしょうか……❓

それはさておき

今回のAdCも,プログラミングに関する記事の他にもゲーム?の紹介記事やイラスト?,サウンド?等の記事などが既に上がっていて,私もそれに乗じてぷよぷよに関する記事を出そうかなと思っていました。「ぷよぷよeスポーツ」(PS4/Switch)はちょうど昨日まででセールが終了し,タイミングとしてもいい感じだと思うのです。
ちなみに私はeスポーツではなく「ぷよぷよ!! 20th Anniversary」(DS)を未だに遊んでいます。ゲームルールが15種類に,豊富なキャラクター,ストーリーモード,がっこうモードがあり,とことんぷよぷよでは巻き戻しができる「とことんれんしゅう」というのもあって非常にオススメです!! DS以外にも3DS,Wii,PSPで遊ぶことができます。

と紹介したところで,肝心のAdCまでに予定していたネタがうまくまとまらなかったので,いつも通り言語紹介記事を書きたいと思います。

?Emojicode?

今回は,Emojicodeというプログラミング言語を紹介したいと思います。以前traPが出した技術書にもEmojicodeについての話を書かせていただきましたが,あれからヴァージョンが0.6に上がって仕様が大きく変わったため,改めてご紹介しようと思います。

Emojicode
https://www.emojicode.org/

?Hello, World!

まずはとにかくHello Worldしましょう。
ファイルhello.emojicに次のようにコードを書きます。

hello.emojic? ?
  ? ?Hello, Emojicode!? ❗
?

私は至って真面目です。

特徴

言語の名称から明らかですが,予約語が絵文字で表現されています。
例えば,?は「改行付き出力(echo)」,?は「エントリポイント(main)」,?...?は「ブロック(begin...end)」を表しています。

実行

実行は,端末から次のようにコマンドを入力します。
emojicodecがコンパイラで,コンパイルすることでネイティヴのバイナリを吐きます。

$ emojicodec hello.emojic
$ ./hello
Hello, Emojicode!

その他の特徴・長所・短所

その他にも,Emojicodeには次のような特徴があります。

クラスベースオブジェクト指向

Emojicodeではクラス?を作ることができます。
構文はJavaに似ていると思います。

class_test.emojic?
  ?クラス
?
? ? ?
  ?️? hp ? ? メンバ変数

  ?
    コンストラクタ
  ?
  ? initHp ? ?
    initHp ➡️?️ hp
  ?

  ?
    ?❗メソッド
    ダメージを与えてhpを減らす
  ?
  ❗ ? damage ? ?
    ↪️ hp ▶️ 0 ?
      hp ⬅️➖ damage
    ?
  ?

  ?
    ?❓メソッド
    hpがないかどうか判定する
  ?
  ❓ ? ➡️ ? ?
    ↩️ hp ◀️? 0
  ?
?

上のコードのコンストラクタは,引数の値を直接メンバに代入しているので,次のコードに置き換えられます。

  ? ? initHp ? ??

インスタンス生成,メソッド呼び出しは次のように行います。

? インスタンス生成
??? 12 ❗ ➡️ invader

? メソッド呼出
? invader 2 ❗
↪️ ? invader ❓ ?
  ? ?CLEARED!? ❗
?

クラスメソッド(いわゆるstaticメソッド)が使えたり,クラスの他にも値の不変性を保持できる値型や値を列挙する列挙型も作れたりしますが,今回は割愛します。

第一級関数

関数を値として,引数や戻り値にすることができます。

callable_test.emojic??
  ? 整数 n が奇数かどうかを判定するcallableを作り,isOddに代入
  ? n ? ➡️ ?
    ↩️ n ? 2 ? 1
  ? ➡️ isOdd

  ? callableを実行
  ⁉️ isOdd 12 ❗ ➡️ isOdd(12)
  ↪️ isOdd(12) ?
    ? ?12 は奇数です? ❗
  ?
  ??
    ? ?12 は奇数ではありません? ❗
  ?

  ? リストを作成
  ? 7 3 6 10 9 16 19 25 35 44 ? ➡️ (´・ω・`)

  ? リストの要素から奇数の要素だけを取り出す(map関数)
  ? (´・ω・`) isOdd ❗ ➡️ (´・ω・)

  ? リストの内容を10進数で出力
  ? element (´・ω・) ?
    ? ? element 10 ❗ ❗
  ?
?

出力:

12 は奇数ではありません
7
3
9
19
25
35

上記コードのisOdd(12)(´・ω・`)(´・ω・)も(括弧を含めて)変数です。Emojicodeでは,絵文字や空白文字以外の文字は識別子になり得るため,自由に変数名を決めることができます(とはいえ,読みやすい変数にしておくことが重要ですが)。

Emojicodeの長所

Emojicodeの短所

?v0.6の主な変更点

コンパイル

今までのコンパイラはバイトコードを吐き出して,Emojicode VM上で動作させていたのですが,v0.6からはコンパイラにLLVMを導入して,ネイティヴバイナリにコンパイルできるようになりました。これにより,実行速度が大幅に改善されたそうです。

絵文字の再選定

絵文字の見直しが行われ,より読みやすくなりました。
以下は改められた絵文字の一例です。

役割 変更前 変更後
1行コメント ? ?
複数行コメント ?...? ??...??
if ? ↪️
else ? ?
elseif ? ?↪️
return ? ↩️
ドキュメントコメント ?...? ?...? または ?...?
整数型 ? ?
浮動小数点数型 ? ?

中置演算子

演算子は今まで関数と同じ扱いで前置記法で書くことになっていましたが,v0.6からは中置記法で書くようになりました。中置記法の際に必要な優先順位の括弧は?...?で表します。

2 ➕ 3 ✖️ 4       ? 14
? 2 ➕ 3 ? ✖️ 4 ? 20

メソッドのムード

メソッドにムードという概念が加わりました。ムードは❗と❓の2種類が用意され,定義時に好きな方を自分で選択できます。同じメソッド名でもムードが異なると異なるメソッドとして扱われるため,真偽値を返す,あるいはsetterであるようなメソッドは❓を使い,それ以外は❗を使うなど,うまく使い分けると良いでしょう。ムードは,メソッド定義時は先頭に書き,メソッド呼び出し時には末尾に書きます。

Unicode 11 対応

Unicode 11は 2018年6月5日に公開されました。追加された新しい文字を表示できる環境は多くないですが,Emojicode v0.6.2から既にサポートしていて,コード中で使うことができます。さすが言語に絵文字を用いているだけあります。

⌨️どうやって入力するか

さて,ここまでEmojicodeの魅力を伝えてきましたが,肝心のコーディングをどのように行うのかという問題があります。macOSの場合は,⌘⌃Space で「絵文字と記号」を表示させることができますが,一々検索してダブルクリックするようでは作業効率がよくありません。

そこで紹介したいのが,Rocketというアプリです。

Rocket
https://matthewpalmer.net/rocket/

実はこのアプリは,traP部員のsigmaからおすすめされたものです。アプリを起動させた状態で,テキスト入力時にコロン(:)に続けて絵文字の名称を入力すると,対応する絵文字をサジェストして変換してくれます。これを紹介してくれたお陰で,私のEmojicodeコーディングが爆速になりました。

基本は無料版で十分ですが,$5(USD)で有料版を購入すると,絵文字の名称を自分で自由に追加することができるようになります。例えば「:if」に「↪️」を対応させたり,「:block」に「??」を対応させたりすると,コーディング時にいちいち絵文字を思い出す必要がなくなります。非常に便利なので,皆さんもEmojicodeでコーディングするときはいかがでしょうか。

おわりに

Emojicodeで,エモエモな絵文字ライフを送ってみるのもいいと思いますよ?。


明日は,whiteonionとshirodoniが担当です。お楽しみに?。

Double_oxygeN icon
この記事を書いた人
Double_oxygeN

創作をします。言語,音楽,数学,プログラミングに興味があります。

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

ERC20トークンを用いた宝探しゲーム(真)の提案【アドベントカレンダー2018 10日目】 feature image
2018年11月3日
ERC20トークンを用いた宝探しゲーム(真)の提案【アドベントカレンダー2018 10日目】
Azon icon Azon
2021年5月19日
CPCTF2021を実現させたスコアサーバー
xxpoxx icon xxpoxx
2019年4月22日
アセンブリを読んでみよう【新歓ブログリレー2019 45日目】
eiya icon eiya
2018年12月12日
多重スリーブの世界と,各種進捗報告。
Silviase icon Silviase
2017年11月17日
そばやのワク☆ワク流体シミュレーション~MPS編~
sobaya007 icon sobaya007
2021年4月26日
CPCTF2021 作問者writeup by zassou
zassou icon zassou
記事一覧 タグ一覧 Google アナリティクスについて