This page is no longer maintained — Please continue to the home page at www.scala-lang.org Introduction This tutorial briefly walks you through writing a plugin for the Scala compiler. It does not go into depth, but just shows you the very basics needed to write a plugin and hook it into the Scala compiler. For the details on how to make your plugin accomplish some task, you must consult other doc
先週、Scalaの公式ページのDivByZeroプラグインを写経して、Scala Compiler Pluginを作成してみました。今度は、いよいよAST変換にトライしてみたいと思います。 動機は、@BeanPropertyアノテーションと@BooleanBeanPropertyアノテーションで、これを毎度毎度フィールドに付与するのってけっこう面倒だと思うのですよねぇ…。クラス単位で付与できないもんかしら?かといって、Scalaのアノテーションを調べても、そんなものはありません。 ※@scala.reflect.BeanInfoアノテーションが名前からして近そうでしたが、残念ながら意味が違いました… というわけで、せっかくAST変換に興味を持ったのでこれをテーマにAST変換を行うCompiler Pluginを作成してみたいと思います。 目標。以下のように、クラス定義に@Beansアノテー
Scalaは比較的DSLに向いている言語と言われていて、設定ファイルとかもScalaで書くといったような流れが各種著名なライブラリにはあるようです。 例えば、LiftのBoot.scalaとか…。 とはいえ、これらの設定ファイルってソースの一部ですよね。それって、都度コンパイルがいるってことじゃない?アプリケーションの再起動は仕方がないとしても、設定ファイルを変えるとコンパイルしなくちゃいけないってあんまりなんじゃ? で、Scala CompilerってJavaVM上で動くわけで…とすれば、Scala CompilerのAPIを直接呼び出すことで動的にコンパイルとかできないものかしら…と思ってちょっと調べてみたら、やっぱりやっている人達いましたよ。 Twitterだったけどね…。 EvalなんてクラスをTwitterが作っていたので、これを参考にScala Compiler APIで遊んで
以前powerモードの一部の機能紹介しましたが、なんだか2.9.0でREPLのpowerモードの機能がさらに増えていて、しかもかなり便利なものを見つけたので紹介 まず :power と打つとpowerモードという、コンパイラ内部にアクセスして、あんなことやこんなことができる変態的なモードになります。2.8.1だと以下のような感じだったのですが scala> :power ** Power User mode enabled - BEEP BOOP ** ** scala.tools.nsc._ has been imported ** ** New vals! Try repl, global, power ** ** New cmds! :help to discover them ** ** New defs! Type power.<tab> to reveal ** scala>
概要 ScalaのREPLでは、「:power」コマンドを実行するとパワーユーザーモード(個人的にはパワーモードと呼んでいる)になる。 Scala2.9.1の例: scala> :power ** Power User mode enabled - BEEP BOOP SPIZ ** ** :phase has been set to 'typer'. ** ** scala.tools.nsc._ has been imported ** ** global._ and definitions._ also imported ** ** Try :help, vals.<tab>, power.<tab> ** パワーモードでしか扱えないコマンドが増える他に、パワーモードでしか使えない変数が現れる。 この変数はREPLインタープリターが使っているインスタンスそのものだったりするので、色々
今回は,Scala 2.9.0に新たに追加されたscala.sys.processパッケージについて紹介します. scala.sys.processパッケージはScala外部のプロセスを扱うための機能が含まれています. 今回のプログラムも,ScalaのREPL(対話型評価環境)上でプログラム実行したいと思います. REPLは配布されているScalaの実行ファイル(scala.batまたはscala)を実行することで起動します. Scalaのサイトからダウンロードし,実行してください. すると,次のようなバナーが表示されると思います. 《 scala(REPL)起動時の表示 》 Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24). Type in expressions to
最近REPLをHackするのが流行ってるみたいなんで俺もやってみた。scala.tools.nsc.interpreter.{IMain, ILoop}あたりのソースコードを読めば大体分かるよ。 REPLをコードに組み込む これは結構簡単で。scala.tools.nsc.interpreter.ILoopを作ってやればよい。ちなみにscala2.8ではscala.tools.nsc.interpreter.InterpreterLoopって名前だったけど2.9ではILoopになった。 import scala.tools.nsc.interpreter._ import scala.tools.nsc.Settings import java.io.{PrintWriter, FileOutputStream} object MyREPL extends App{ val setting
DZoneでScalaのREPLのフロントエンドGUIであるScalaConsoleというのを見つけたので試してみました。 ・centaur / ScalaConsole / wiki / Home — Bitbucket 使い方: 1. scalaconsole_2.9.0-1-1.3.jar をダウンロード 2. 起動 起動は簡単。scalaコマンドにjarファイルを渡してあげるだけ。 お、動いた! 左ペインにスクリプトを入力、Ctrl+Rで右ペインに実行結果が表示されます。 REPLはターミナルから操作した方がオトコマエなんだろうけどGUI派の自分としては嬉しいです。 長めのスクリプトをトライ&エラーで試したいときもテキストエディタから貼り付け直したりせずガンガン編集しながら実行できるのが特に良い! ちなみに選択した部分だけ実行(Shift+Ctrl+R)することもできます。 3.
これは Scala Advent Calendar 2011の3日目です Scalaには、メタプロの機能がありません。そもそもメタプロの定義が曖昧というか、存在しないと思いますが「メタプロとは何か?」を語っても長くなるので略。 そのあたり詳しくないですが、例を挙げるとC++のtemplateでできることが、Scalaではできないなどあります。 たまに自分が欲しくなるものとしては可変長型引数ですかね。 そのあたりの話は、@cpp_akira さんのこのスライドがわかりやすいです。 で、現在Scalaにメタプロの機能がないのに、なんでこんなことを書いているかというと、2.10以降でmacroが入る話があるからです。 http://scalamacros.org/ https://github.com/scalamacros/kepler がしかし、これはまだかなり製作途中で使える状態ではないよ
最近は、sbtをいじって、projectのbuildの本質とは関係ない自分だけが得する微妙な便利機能を入れて、project定義のファイルをぐちゃぐちゃにするのがマイブームなわけですが(・ω・´) sbt には(Scalaの標準のものと似ているけど少し違うらしい)独自の Parser がついていて、それらが、 InputTask や Command の Parse に便利に使えるようになってるらしいです。詳しくはこのあたりのページ ↓ 読んでください。 http://www.scala-sbt.org/0.12.3/docs/Detailed-Topics/Tasks.html http://www.scala-sbt.org/0.12.3/docs/Detailed-Topics/Parsing-Input.html http://www.scala-sbt.org/0.12.3/doc
takeda-soft.jp 2024 著作権. 不許複製 プライバシーポリシー
概要 最小限サンプル 探索サンプル 変換サンプル [/2011-09-11] 実行方法 通常の実行 [/2011-09-02] デバッグ実行 [2011-09-10] Eclipseでの実行 [2011-09-10] 関連クラス [/2011-09-12] 概要 コンパイラプラグインは、Scalaコンパイラー(scalac)にロジックを追加し、コンパイル時に独自の処理(ソースをチェックしてエラーを出したりコードを置換したり)を行えるようにするもの。 Scalacではフェーズと呼ばれる段階があって、それぞれのフェーズで個別のコンパイル処理を行っている。 自作プラグインは、新しいフェーズを作ってコンパイル時に呼ばれるようにして独自処理を行う。 最小限の動作確認サンプル 独自プラグインクラス scalac-plugin.xml プラグインのコンパイル プラグインのソース Pluginクラスを継承
Java SE7も Developer Preview Releaseが出てもうみんな当然のように入れてると思います。 で、JavaSE7に入るProject Coinに、整数リテラル区切り文字ってのがあります。ようは、数値リテラル中で"_"による区切りを入れることを許すって仕様です。 int a = 123_456_789; int b = 0xFF_99_66; int c = 0b1010_1000_1111; Java技術最前線 - Java SE 7徹底理解 第1回 言語仕様の小さな変更 - Project Coin:ITpro この仕様は最新のScala2.9.0にも入ってません。ScalaはJavaとはコンパイラが違うから当然ですね。 で、これをScalaでも使えるようにしてみます。やり方はとっても簡単。最新のScalaコンパイラのソースコードをGithubから取得して、以下
概要 [/2011-09-11] 要素の生成 Symbol [/2011-09-11] Name [2011-09-11] Type Tree [/2011-09-11] TreeDSL [2011-09-09] 概要 Scalaコンパイラプラグインでコードを変換する場合は、PluginComponentにTransformトレイトをミックスインし、newPhaseでなくnewTransformerをオーバーライドする。 (Transformトレイトの中でnewPhaseがオーバーライドされ、newTransformerを呼び出すようになっている) import scala.tools.nsc.{ Global, Phase } import scala.tools.nsc.plugins.{ Plugin, PluginComponent } import scala.tools.nsc
treehugger はコードを用いて Scala のソースコードを書くためのライブラリだ。それはまた、Refelection API に基づく Scala AST の代替実装の一つでもあり、github で eed3si9n/treehugger として公開している。まだ実験だ段階だけど、一区切りをつけるために何か書いてみることにした。 背景 コードを生成するコードを書くのは楽しいけれども、String を数珠つなぎにしたコードを書くのは楽しくない。そう思っていた所ちょくちょく Reflection API を用いて生のコードを AST (abstract syntax tree) に lift するコード例を見かけるようになった: scala> scala.reflect.Code.lift((x: Int) => x + 1).tree res0: scala.reflect.Tre
Scalala (https://github.com/scalala/Scalala) をちょこっと使うのに便利なように scalala-console を用意しました。 https://github.com/akr4/scalala-console sbt の initialCommands で import しているだけですw たくさん import しないと使えないんですよね 利用例 % sbt console [info] Set current project to default-435ec2 (in build file:/Users/akira/projects/scalala-console/) [info] Starting scala interpreter... [info] import scalala.scalar._ import scalala.tenso
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く