Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scala製インタプリタをブラウザで動かす3分クッキング

 Scala製インタプリタをブラウザで動かす3分クッキング

9b888a029ae98abd2675b115ff0c4256?s=128

Rikito Taniguchi

September 09, 2017
Tweet

Transcript

  1. Scala 製インタプリタをブラウザで動かす 3 分クッ キング id:tanishiking24 Scala 関西 Summit2017 1

  2. こんにちは • • twitter @tanishiking • id:tanishiking24 • Web アプリケーションエンジニア@はてな

    • 主に Scala、たまに TypeScript/Perl 2
  3. 今日作るもの • https://github.com/tanishiking/MLScala 3

  4. 手順 • インタプリタを作る • Scala.js でビルドする • UI を書く •

    完成! 4
  5. インタプリタを作る このあたりを参考に頑張る • https://github.com/ksuenaga/IoPLMaterials • http://esumii.github.io/min-caml/ パーサコンビネータに fastparse 使った 5

  6. インタプリタを作る こちらにあらかじめ作ったものが 6

  7. Scala.js でビルドする 公式ドキュメントを参考に build.sbt をいじる • crossProject で shared,js,jvm 用にプロジェクト分ける

    • コアロジックは shared 以下につっこむ、雑に全部ごっちゃに すると sbt test が動かなくなったり • https://github.com/scala-js/scala-js/issues/739 7
  8. Scala.js でビルドする • export するモジュールやメソッドを annotation で指定 • プログラムの文字列を入力として print

    メソッドに渡した値の 文字列を返す簡素な API import scalajs.js.annotation._ @JSExportTopLevel(”ML”) object Interpreter { @JSExport def interpret(input: String): String = { // ... 8
  9. UI を作る • ビルド成果物の JS を雑に読み込んで、さっき export したメ ソッドを実行したらなんか動く •

    標準出力は console に出てくる ... <script src=”./js/target/scala-2.12/mlscala-fastopt.js”></scrip ... <script> const result = ML.interpret('let x = 1 in print x;;'); </script> 評価結果を適当な div につっこんで表示する感じで 9
  10. 完成!! http://tanishiking.github.io/MLScala/ 10

  11. まとめ • 普通に動いてすごい • 面白 AltJS くらいの印象だったけど Scala 製モジュールのデモ に良さそう

    • ブラウザで動かしたいけど JS で書きたくないモジュールある よね 11