見出し画像

【AiScript】新しい遊び場【開発記】

今回の概略

唐突に始まる Misskey Play の作成記🤪
根底に有るのは JS
switch や三項演算子は無いがブロックは値を返すという仕様らしいので Kotlin みたいな if else 書式で値を返せ、 elif によって when と同等の処理になるっぽい
幾つかの書式はラムダ的に丸括弧を省略する記述方式が web 上の記事に散見されるがこの記事を書いてる ver では括弧を省略すると文法誤り
テンプレートリテラルは JS 的に書いても通るがどこまで複雑な書式が許されるかは不明
記事では触れてないが let は実際 immutable にはなっていないらしい

#Misskey #Play #AiScript


何やってるの🙄(困惑

twitter 終焉説が流れ始めてみんな予備の SNS 探しが始まってるよね🤔
ウチも類に漏れず Misskey に垢を作ってみたんだけどここ、他の SNS と違って自分で玩具おもちゃ作れるじゃないの🤤

という事でどんななのか触ってみようずってところから始まるお🤪


Misskey Play って?

Misskey やってると御神籤とか○○チャレンジとか○○スロットみたいのが流れてきて試しに Play をポチっとなしてみた人、結構居るんじゃない?🤔
あれ、元々はなんか機能を拡張するための仕掛けらしいんだけどそれを使ってそのままゲームとかをこしらえられるようになってる…いや、逆?良くわからないけど標準で用意されてる機能の一つ🤤


新規作成

そもそも Play を表示すると "人気" "自分のPlay" "いいねしたPlay" というタブが出てて最初は人気の一覧が出てるのよね🤔

自分の Play タブは最初「! ありません」になってて上にある緑の「 + 」ボタンで新たに作成ができてテンプレートで Hello, {yourname} のコードが付いてくるお🤤親切
でもこれ、動かせるけどこれ以上の事は分からないのよね😞

/// @ 0.13.1

var name = ""

Ui:render([
	Ui:C:textInput({
		label: "Your name"
		onInput: @(v) { name = v }
	})
	Ui:C:button({
		text: "Hello"
		onClick: @() {
			Mk:dialog(null `Hello, {name}!`)
		}
	})
])

この言語仕様は判らないけどテキスト入力 v を name に入れて hello ボタンを押すとダイアログで `hello, {name}!` を出してる…となっている…のかな?🤔
一先ずそのまま保存して作動させてみようず🤤

ええ…ダイアログ、有るんだ…🙄
動作は想定通りかな🤔

テンプレートを選べるから御神籤に変更してみようず🤤

この御神籤テンプレートで分かるのは変数宣言は let を使い、配列は []角括弧 、恐らく辞書hash{}波括弧 で値の区切りは改行…?カンマは使われていない🤔
USER_ID や THIS_URL などの所謂いわゆる環境変数と Date:year() 等から見るビルトインオブジェクトの存在に関数の呼び方はコロン区切り…😑
それとテキストのテンプレートリテラルは JSJavaScript 同様バッククォート括りだけど ${} ではなく {} なので波括弧エスケープは別途存在してると思われ🤔

ここまで書き出した段階でテンプレートにある Ui:C:xxx という書き方は JS で言うピリオド区切りで階層構造を掘ってると思われるけれど Ui:C が何を指しているのかが良くわからない😑
JS みたいに一旦空を作らなくても無ければ勝手に階層を作成してくれる系かなと思うので C という名前の器なのか C とする事が定形なのかはまだ良くわからないけど資料をあたれば出てくるかな?🤔

予想では事項すると真ん中に mfm 有効になった運勢がいきなり表示されて投稿ボタンが出てる、という画面が現れる筈だけど…🤔
とりあえずこの御神籤を Play してみるぽ🤤

_人人人人人_
> ギガ吉 <
 ̄Y^Y^Y^Y^ ̄

初っ端で最高かよ🤤


資料を探す

プラグイン
https://misskey-hub.net/docs/features/plugin.html

Misskey Webにはプラグイン機能があり、ユーザーがMisskey Webの機能を拡張することができます。

プラグインの作成
https://misskey-hub.net/docs/advanced/create-plugin.html

AiScript
プラグインはAiScriptを使って記述されるスクリプトです。

AiScript についての情報は…?🙄
ヘルプから辿れるのはここまでっぽ😞

syuilo / aiscript
https://github.com/syuilo/aiscript

AiScriptは、JavaScript上で動作する軽量スクリプト言語です。

ド直球開発者本人 github ページ🙄
完全なる一次ソースじゃん🤪

Download ZIP っと………💾


一次ソースから分かる事

具体的に興味が有る人は実際取りに行ってるだろうからそういう手合のは省くとして…


文法

根本は JS だと思って良さそう🤤
糖衣構文やラムダを取り入れた表記が多いようだけど序盤を見た感じで JS と同じ構文が通るのかは不明😑


オブジェクト辞書ハッシュ系についてはセミコロンでの区切りも有りだけどホワイトスペースで良いみたい🤔
(配列のカンマ区切りも同様)
以前から辞書の直設定はカンマの位置とか先頭は有る無いなんかで揉めてたけどこの実装だとホワイトスペースっぽいので列挙しやすい🤤
ただその分値の「枠」が厳格で各種の括弧を多く使う印象が有るかな…😑
第1級オブジェクトとして書かれているけれど undefined が出てこないので可能な限り null による使用を心がけないとならないかな🤔
undefined と null で別物だからって喜んで使う自分みたいなやり口は AiScript では御法度と思われる🤪

let についてはどうやら内部で const としているっぽい🙄
mutable で使うには var が使える😞var から逃げるな


演算が2項演算しか許容されてないっぽい…😞
1+2+3 みたいのは ((1+2)+3) って書かないとだめ…みたいに解釈できる🙄

………
他の Play のソース見ると普通に (1 + 2 + 3) になってた🤤
とりあえず括弧で括っておけば通る…のかな、多分🤔
ついでにオブジェクトのアクセスはどうするのかと思ってたけど JS と同じピリオド区切りだったからコロン区切りはどうやら API 呼出しなのかな🤤
あれ?とするとやはり Ui:C の C って何…?🙄

文字テンプレートで変数の参照は書かれてるけどエスケープには言及が無い😞
まぁ JS だから \ で行けると思うけど😑


改造から

API とか判らないから御神籤の改造をとりあえずやってみるぽ🤤

………色分け存在しないから TypeScript 選んだけど普通に見辛い…😞

めっちゃ強引だけど御試しって事で🤤
41行のリテラル内で JS だとこの書き方が許されるけど果たして…🙄

なんか丸括弧がおかしい…?🙄

どこでエラーが出てるのか判らないので念の為テンプレートリテラルの join は別変数へ一旦格納の方向で😞

AiScriptで困ったときに見るメモ
https://qiita.com/saki-lere/items/851c4500d56659d15c9c

let x = 'abc'
let y = 'def'
<: `{x}{y}` // abcdef
<: [x, y].join() // abcdef

合ってる様に見えるけど "" は要らないのかしら🤔
でも取ったところでエラー無くならないしわかんない…😞

超原始的な手法😑
UI 表示は弄ってないので手前部分をコメント化して絞り込む算段🙄

流石にこれは出る😞
怪しいのはテーブル定義なのよね、実は。そこだけ復活してみるぽ🤔

使ってないので宣言が正しければエラーにはならない筈
一気に for まで解除しようかと思ったけど念の為😑
まだ大丈夫
危なそうな for

下手人は for 🙄
これ、多分ラムダ的な丸括弧無し表記ができる ver とできない ver があるのかなって思う😞

まぁ多分こういう事だよね的な🙄
通った🤤
join 復活

ヨシ!👈🤪


判った事

根底に有るのは JS
switch や三項演算子は無いがブロックは値を返すという仕様らしいので Kotlin みたいな if else 書式で値を返せ、 elif によって when と同等の処理になるっぽい
幾つかの書式はラムダ的に丸括弧を省略する記述方式が web 上の記事に散見されるがこの記事を書いてる ver では括弧を省略すると文法誤り
テンプレートリテラルは JS 的に書いても通るがどこまで複雑な書式が許されるかは不明
記事では触れてないが let は実際 immutable にはなっていないらしい


次回は

VSCode の書式って自作できるのかな… AiScript の文法のは、古いのしかなくて入れられないのよね🤔

この記事が気に入ったらサポートをしてみませんか?