kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

MiMa(Migration Manager)でScalaプロジェクトのバイナリ互換性をチェックする

MiMaは主にScalaライブラリ(Scala本体を含む)のバイナリ非互換な変更をチェックしてくれるライブラリです(おそらくバイトコードレベルの検査なので、Javaプロジェクトでもチェックできると思うのですが試していない)。 元々の経緯としては、Scala 2.9以…

Macro PEG 0.0.7 リリース

今回から、sbt-releaseを使ってリリース作業を半自動化してみました。便利ですね、sbt-release。sbt-sonatypeと組み合わせれば、最初にリリース番号と、次のSNAPSHOTバージョン番号答えるだけで後は全自動。 それはともかく、今回のリリースでは、パーザコン…

Macro PEGとParser Combinatorの関係に関するメモ

特に他の人が読むことを想定して書いていないので、あしからず。Parser Combinatorに関しては、Scala風味の記述で。 0階PEGは、相互再帰的なlazyな値(=> Parser[T])の集まり(式はPrimitiveと基本的なCombinatorで構成される) Primitive 文字列リテラル: "s…

あなたの知らないKotlinのsmart cast(known as Flow-Sensitive Type)

皆さん、Kotlin触っていますか?Kotlinかわいいですよね、Kotlin(どの口がそんなことを言うかって感じですが)。Kotlinにはsmart castという機能があり、安全なキャストができます、というのは不正確で、KotlinはFlow-Sensitive Typeと呼ばれる型システムを…

Macro PEG 0.0.6 リリース

もはやDaily Releaseになってきたので、Daily Buildをスナップショットで提供だけでいいんじゃないかとかそういう気がしてきましたが、まあ練習と思ってしばらく継続していく予定です。 しかし、そろそろsbt-release使ってリリース自動化すべきときですね。 …

Macro PEG 0.0.5リリースしました。

HOPEGからMacro PEGに改名しても、バージョン番号はそのまま上がっていますが、タグがぶつかるのが嫌だったので…。 Release releases/0.0.5 · kmizu/macro_peg · GitHub 主な変更は 文字クラスサポート S = [a-zA-Z_][a-zA-Z0-9_]*; こういう、識別子を表す…

Macro PEGで「一度現れたら再出現しない修飾子」+「相互排他的な修飾子」を表現してみる

gist.github.com とりあえずMacro PEGのコード。 「排他的な修飾子」とは何のことかというと、たとえば、public, private, protectedのように、「一度どれかが出現したら他のものは出現しない修飾子」のことです。最近のプログラミング言語の文法では、この…

Higer Order PEG(HOPEG)をMacro PEGに改名しました

タイトルの通りです。githubのプロジェクト名称、パッケージ名なども既に変更済みです。 github.com 元々、Higer Order PEGおよびFirst Order PEGは、Macro Grammarと呼ばれる、文脈自由文法を拡張して、非終端記号が引数を取れるようにしたものにインスパイ…

Higer Order PEGで「一度現れたら再出現しない修飾子」を表現してみる

gist.github.com とりあえずHOPEGのコードを貼り付けます。表題のような言語をHOPEGで表現する方法ですが、「一度見た修飾子の集合」をどこかに取っておく必要があります。それがModifersの引数AlreadyLookedです。一度どれかの修飾子を読むたびに、AlreadyL…

HOPEG 0.0.3リリースしました。

今度は評価器の修正。exampleを足すとバグが顕在化してきますね…。 github.com

HOPEG 0.0.2リリースしました。

主な変更点は、構文解析器のバグ修正です。結構間抜けなバグを仕込んでしまったものだと思います…。 Fix bug of HOPEGParser. · kmizu/hopeg@a7a72bc · GitHub

HOPEG 0.0.1リリースしました。

タイトル以上のことはほとんど書くことがないのですが、HOPEG、最初のリリースです。 詳しくは以下。 github.com hopeg 0.0.1をlibraryDependencyに追加して、利用コードの中で import com.github.kmizu.hopeg._ val grammar = HOPEGParser.parse( """ |S = …

Higher Order PEG(HOPEG) がHiger Orderになりました

去年のエントリ kmizu.hatenablog.com でHigher Order PEG(HOPEG)の評価器を公開したと書いたのですが、その時点でのHOPEGは、まだ First Orderで、パラメタ付き規則自体は扱えても、規則そのものを引数として渡すことはできませんでした。で、最近、再びHOP…

Java Generics 導入の裏側

このエントリは、これまで自分がさんざんTwitterで書いてきたことですし、Martin Odersky教授へのインタビュー www.artima.com でおおむね語られていることでもあります。ただ、この辺の事情についてあまり詳しくない方も居るようなので、上記インタビューの…

過敏性腸症候群という病気

注意 以下は、お腹壊すとかそういう系統の話になりますので、苦手な方は読むのをご遠慮ください。 皆様、こんにちは。@kmizuです。そういえば、今日はScalaMatsuri 2016の2日目でしたね。私は何をしてたかと言えば、風邪&下痢で寝込んでいました。1日目も…

Scalaのマクロは「実験的」(experimental)な機能です

タイトルがほとんど全てを表していますが、念のため説明します。 Scala 2.10からマクロが言語機能として導入され、Scala 2.11でも維持されています。ただし、あくまで現状のマクロは「実験的」な機能であり、ファイル毎に import scala.language.experimenta…

構文解析勉強会Vol.2 開催します

parser.connpass.com の続編です。 parser.connpass.com 前回は、話題をPEGに限定していましたが、今回は、いわゆるTop-down構文解析全般を扱います。よく知られているLL(1)から、比較的最近のGLL、LL(*)までを取り扱えればと思います(あくまで努力目標です…

Scala doesn't Need Generics! (or You can Encode Generics Using Abstract Type Members)

タイトルは煽りではありません。もちろん、Scalaを実用的に使う上では「直接」Genericsを扱えないのは困ります。しかし、記述の冗長ささえ我慢すればGenericsのほぼ全ての機能をAbstract Type Membersによって表現できます。このことを指して、GenericsはAbs…

入門fastparse(1) ~四則演算評価器を作ってみた~

fastparseというScala用パーザコンビネータライブラリがあります。このライブラリ、Scala標準のパーザコンビネータライブラリよりかなり速い(ここの説明によると100倍速いそうな)というウリらしく、Scala標準のパーザコンビネータライブラリから乗り換えてみ…

2015年を振り返ったりする話

大晦日ですね。皆さん、大晦日にはその年の出来事をまとめるのが習わしのようなので、自分も何か書いてみることにします。 今年の振り返り 新人研修(Scala編)のテキストを書いた 既に ch.nicovideo.jp で書かれてる公開情報なので書きますが、「エンジニア…

チーズがうまい

私生活的なことは、普段このブログには書かずにTwitterで済ませるのですが、ちょっと気がむいたので書いてみます。といっても、タイトル以上のことはほとんどないのですが。 自分の住んでいるアパートの近くには、24時間営業の肉のハナマサがあり、そこで、…

新言語Klassic作り始めました

まあタイトルの通りなんですが、とりあえずこれまでの自分の言語作成遍歴についても触れておきます。 大学入学前:四則演算パーザ&評価器 大学1年:正規表現パーザ&評価器 大学2年:オブジェクト指向言語Onion(Javaコードへのトランスレータ) 大学3年…

ScalaでMLスタイルのモジュールを使ったプログラミングをする

何はともあれ以下のコードを見てください(ちなみに複素数クラスの実装は、 d.hatena.ne.jp を参考にさせていただきました): trait Complex { type T def re(a: T): Double def im(a: T): Double def make(re: Double): T def plus(a: T, b: T): T def minu…

IOと例外の取り扱いについて:どっちが良いスタイル?

追記:Java 7以降(つまり、現在)はtry-with-resources構文があるので、それを使えばよいです。ここでは、Java 6かそれ以前のコーディングスタイルについて主に言っています。 kmizu.hatenablog.com におけるkrxrossさんのコメント java脳だと、「fw = new …

Crystalの型システムで遊んでみた

この記事はCrystal Advent Calendar 2015 23日目の記事です。 まず最初にお断りしておきますが、私はCrystal言語に関しては初心者もいいところです。じゃあなぜCrystal Advent Calendarにわざわざ参加したかというと、Crystalは実用言語としてはやや特殊な静…

Scala雑談会やります(2016年1~2月予定)

詳細な時期は未定(来年初頭予定)ですが、Scala雑談会なるものをやろうと企画しています。Scalaの勉強会といえば、160回超の開催を続けているrpscalaが有名ですが、今回やろうとしているのは「勉強会」ではなく「雑談会」です。これの元ネタは、5年ほど前ま…

OpenJDK javacにみるMartin Odersky氏の痕跡

Martin Odersky氏と言えば、Scalaの開発者として有名ですが、そんな彼がJDK 1.3以降のjavacの作者でもある(ただし、その時点ではジェネリクスはオフであった)ことは知る人ぞ知る話になっています。 さて、ということは、OpenJDKのjavacのソースコードにOde…

『Scalaファンクショナルデザイン ―関数型プログラミングの設計と理解』の雑感

表題の書籍について、出たとき(2015/5/29)に買って随分放置していたのだが、最近、一通り読んでみたので簡単な感想を書いてみようと思う。 結論からいうと、Scalaについて特に使う予定はないがおおまかにどんな言語か知っておきたいという方にはそこまで悪…

無名関数のためのプレースホルダ構文の特異性 ~Scala Advent Calendar 2015じゃないよ~

本当はScala Advent Calendarの記事として書こうと思っていたのですが、既にだいたい埋まってしまっていたので、自分のブログで書きます。Scalaistの皆さん、プレースホルダ構文、使ってますよね? List(1, 2, 3, 4, 5).map(_ + 1) // List(2, 3, 4, 5, 6) …

Higher Order PEG(HOPEG) のパーザおよび評価器を公開しました

Higher Order PEG(HOPEG)とは何かというと、Parsing Expression Grammar(PEG)の規則が引数を取れるように拡張したものです(ちなみに、引数を取る規則をRule Constructorと呼んでいます)。 後で考えると、0階のPEG = 普通のPEGとすると、1階のPEG = First O…