-
-
Save tanishiking/70d3acfc7edef365fa0e5d5a9351996e to your computer and use it in GitHub Desktop.
img/mlscala-repl/*.png |
参加しました!今年は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:
- https://speakerdeck.com/tanishiking/scalazhi-intapuritawoburauzadedong-kasu3fen-kutukingu
- http://tanishiking.github.io/MLScala/
- https://github.com/tanishiking/MLScala
インターネットにある資料を参考に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}
公式ドキュメントを参考にbuild.sbtをいじる
- crossProjectでshared,js,jvm用にプロジェクト分ける
- コアロジックはshared以下につっこむ、雑に全部ごっちゃにするとsbt testが動かなくなったり
- scala-js/scala-js#739
- exportするモジュールやメソッドをannotationで指定
- プログラムの文字列を入力としてprintメソッドに渡した値の文字列を返す簡素なAPI
import scalajs.js.annotation._
@JSExportTopLevel("ML")
object Interpreter {
@JSExport
def interpret(input: String): String = {
// ...
- ビルド成果物の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で書きたくないモジュールあるよね