Skip to content

Instantly share code, notes, and snippets.

@tanishiking
Last active November 15, 2017 00:56
Show Gist options
  • Save tanishiking/70d3acfc7edef365fa0e5d5a9351996e to your computer and use it in GitHub Desktop.
Save tanishiking/70d3acfc7edef365fa0e5d5a9351996e to your computer and use it in GitHub Desktop.
img/mlscala-repl/*.png

Scala関西Summit2017に参加/LTしました #scala_ks

参加しました!今年は4トラックもあってScalaコミュニティの盛り上がりを感じる良いイベントでした。 https://skug.connpass.com/event/62304/

ついでにScala製インタプリタをブラウザで動かす3分クッキングというタイトルでLTもしてきました。


今年のトーク内容は入門内容から、Scala導入事例紹介、Akka、FunctionalProgramming、言語コア、設計などなど多岐に渡っており、いろんな人に門戸を開いたバランスの良いカンファレンスだなと思いました(運営のみなさまありがとうございます)

個人的にはこのあたりのトークが特に興味深かったです。

  • プレースホルダ構文完全解説
    • Scala Language Specification
    • プレースホルダ構文の挙動をSLSを参照しながら追いかけて行って解説する話。
    • 発表時間中には内容についていけなかったがSLSを参照するとっかかりができてよかった
  • Scala on JVM をプロファイリングするツールの紹介
    • LL系言語からきたScalaエンジニアなどで、Javaエンジニアならよく知ってるJVMプロファイリングツールを紹介する内容。
    • まさしくJVMプロファイリングツール知見0な人間なのでこういうツール紹介的な話はありがたかった:pray:

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

インターネットにある資料を参考にScalaでおもちゃレベルのmini-MLインタプリタを昔作っていたのでそれを引っ張り出して、Scala.jsを使ってブラウザで動かして遊んでみたよという話。 似たような取り組みは id:motemen さんが3年前にやってたり、いろんな人がやってると思います。

(あらかじめこちらに作ったものが...という3分クッキングあるあるネタが受けたのはよかった)

Scala.jsを使うのは初めてだったけれど、パーサーコンビネータに(Scala.jsに公式対応してる)fastparseを使っていたのもあってシュッとビルドできたし、Annotationによるexportするjsモジュールの指定や、crossProjectを使ってjs向けにだけビルドしたい部分でJVM向けにだけビルドしたい部分とコアロジックをうまく切り分けて管理・テストできるのも便利だった。

勉強用に作ったものなのでこれからも継続して勉強しながらいろいろ実装していきたい٩( 'ω' )و


今年もScala関西Summit楽しかったです!開催してくださった運営・スピーカー・スポンサーのみなさんありがとうございました!

pandoc -t beamer -V theme:metropolis -H header.tex --latex-engine=lualatex -V fontsize:19pt -o slides.pdf slides.md
\usepackage{luatexja}
\usepackage{animate}
\usepackage{graphicx}
\hypersetup{unicode=true}

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

こんにちは

  • \includegraphics[width=50px]{./img/icon.jpg}
  • twitter @tanishiking
  • id:tanishiking24
  • Webアプリケーションエンジニア@はてな
    • 主にScala、たまにTypeScript/Perl

今日作るもの

\includegraphics[width=250px]{./img/screenshot.png}

手順

  • インタプリタを作る
  • Scala.js でビルドする
  • UIを書く
  • 完成!

インタプリタを作る

このあたりを参考に頑張る

パーサコンビネータにfastparse使った

インタプリタを作る

こちらにあらかじめ作ったものが

\animategraphics[autoplay,loop,width=300px]{5}{./img/mlscala-repl/mlscala-repl-}{10}{45}

Scala.jsでビルドする

公式ドキュメントを参考にbuild.sbtをいじる

  • crossProjectでshared,js,jvm用にプロジェクト分ける
  • コアロジックはshared以下につっこむ、雑に全部ごっちゃにするとsbt testが動かなくなったり
  • scala-js/scala-js#739

Scala.jsでビルドする

  • exportするモジュールやメソッドをannotationで指定
  • プログラムの文字列を入力としてprintメソッドに渡した値の文字列を返す簡素なAPI
import scalajs.js.annotation._

@JSExportTopLevel("ML")
object Interpreter {
  @JSExport
  def interpret(input: String): String = {
    // ...

UIを作る

  • ビルド成果物のJSを雑に読み込んで、さっきexportしたメソッドを実行したらなんか動く
  • 標準出力はconsoleに出てくる
...
<script src="./js/target/scala-2.12/mlscala-fastopt.js"></script>
...
<script>
  const result = ML.interpret('let x = 1 in print x;;');
</script>

評価結果を適当なdivにつっこんで表示する感じで

完成!!

まとめ

  • 普通に動いてすごい
  • 面白AltJSくらいの印象だったけどScala製モジュールのデモに良さそう
  • ブラウザで動かしたいけどJSで書きたくないモジュールあるよね
Display the source blob
Display the rendered blob
Raw
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment