読者です 読者をやめる 読者になる 読者になる

kmizuの日記

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

Macro PEG 0.0.9 リリース

今回のおもな変更点は、 Fix bug of + combinator. · kmizu/macro_peg@187e448 · GitHub Generalize evalCC combinator. · kmizu/macro_peg@fd4525f · GitHub です。一点目は、まだそんなバグが残ってたのか…と自分に呆れるばかりです。二点目は、evalCCの型…

新しい言語を覚えるために私がした事(Kotlinの場合)

先日の、Scala勉強会第170回 in 本郷 : サブテーマ「Scalaの言語仕様」 rpscala.doorkeeper.jp でScalaの言語仕様について解説していたときの反応をみて、どうも、自分のプログラミング言語の把握の仕方はあまり一般的ではないのではということを考えました…

Scalaのメソッドや関数に関するQ&A

Scala勉強会第170回 in 本郷 rpscala.doorkeeper.jp は、サブテーマ「Scalaの言語仕様」であったため、久々に熱弁をふるったところ、特に、メソッドや関数の仕様や区別に関して疑問に思った方が多かったらしく、質問も多かったので、Q&A形式でまとめておきま…

Macro PEG with 後方参照で、「変数宣言がない場合エラー」を構文解析時にチェックする

ほぼタイトルの通りです。先日導入した、Macro PEG + 後方参照の拡張を利用することで、変数宣言のテーブルのようなものを構文解析時に作り出すことができるようになったので、それを利用することで、変数宣言をみるたびごとに、table | varibleのようにして…

Kotlinのsmart castの限界

Kotlinには所謂smart castと呼ばれる(公式ドキュメントがそう称している)機能があります。 たとえば以下のように、ifの条件式でnullチェックをすることにより、その中ではnot-nullableな型として扱うことができます。 gist.github.com ただし、一般的に、…

Macro PEG 0.0.8 リリース

github.com 今回のリリースでは、いわゆる後方参照と呼ばれる拡張をパーザコンビネータに導入してみました。 Introduce backreference as `evalCC` method. · kmizu/macro_peg@91154c8 · GitHub このコミットです。 使い方は gist.github.com こんな感じです…

Kotlinによるパーザコンビネータライブラリ kotbinator 0.1 公開しました

実はリリースしてから、Kotlinのパーザコンビネータライブラリがあることに気づいたのですが、まあ、どうせexperimentalだし、自分ならではの独自路線歩みたいし、気にしないでいくことにしました。 最低限の使い方は、 github.com に書いておきましたので、…

Kotlinのブロックからなる関数定義でreturnを書かなくて良いようにする

Kotlinでは、一つの式からなる関数は fun add(x: Int, y: Int): Int = x + y のように明示的なreturnを必要としません。次のように複数の式からなる関数定義ではreturnが必須となります。 fun printAndAdd(x: Int, y: Int): Int { val k = x + y println(k) …

プロジェクトのバイナリ互換性をうっかり壊してしまわないように、最初に気を付けるべきこと(主にScala)

先日、MiMaの紹介のために、 kmizu.hatenablog.com を書きましたが、それの続編みたいな何か。基本的なことだと思うのですが、色々なScalaプロジェクトがバイナリ非互換な変更の元になる行為を意図せず行っている気がするので、啓蒙のために書いてみることに…

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…

おーぷんぷろぶれむ!(1) ~ PEL ⊃ CFL 問題

こんばんは。久しぶりにブログ書いてみることにしたのですが、以前と同じネタだとモチベーションが保てないので、今回はちょっと変わったタイトルにしてみました。 平仮名にしたかっただけだろうおまえと言われそうですね。はいそうです。 というのはおいと…

PEGと構文解析に関するアレコレの勉強会 Vol.1 開催の動機について

勉強会についての詳細はこのエントリの一番下の方をみてもらえればと(もうほとんど枠が埋まっちゃってますが。この辺はほんとに予想外)。このエントリでは、なんでこんな勉強会やろうとしたかという動機でも書いておこうかなと思います。 私は大学院生時代…

Rustのおべんきょう(12) - Hello, List(count) -

淡々と。 gist.github.com

Rustのおべんきょう(11) - Hello, List(contains) -

ただひたすら書く。そろそろモジュールに分けた関数群を別ファイルに分離してもいいかも…。 gist.github.com

Rustのおべんきょう(10) - Hello, module -

Rustでモジュールを定義する方法について。mod module_name { }で囲んだ範囲がモジュールになるらしい。また、モジュール内の関数の内、pubを付けなかったものはモジュールprivateな関数になる。useはそれが使われたモジュールのスコープ内でのみ有効、など…

Rustのおべんきょう(9) - Hello, List(filter)

お次はfilter。少しずつ関数が増えていく。 gist.github.com

Rustのおべんきょう(8) - Hello, List(concat, flat_map) -

まだまだ所有権の概念に慣れない今日この頃だが、とりあえずArc<T>でごまかしている。ともあれ、ようやくList上の高階関数が揃ってきた。今回の難所はflat_map。間にconcat関数を定義してやることでなんとか実装。 gist.github.com</t>

Rustのおべんきょう(7) - Hello, List(map) -

map関数も欠かせませんね。というわけで: gist.github.com ループで回すのはめんどくさいので、fold_rightで実装しました。

Rustのおべんきょう(6) - Hello, List(fold_right) -

fold_leftができたので次はfold_rightもできるよね、というわけで。 gist.github.com

Rustのおべんきょう(5) - Hello, List(fold_left) -

Listを作ったので次はfold_leftだよねー、というわけで書いてみた。しかし、型を合わせるのに結構手間取ってしまった… gist.github.com

Rustのおべんきょう(4) - Hello, List! そのに -

Vec<T>型を引数で受け渡して、それをList<T>型に変換することで、とりあえずリストの生成を簡単にすることができた。しかし、ここでT : Copy にしちゃったからList<List<>>型はnew_list関数では作れない気がしてきた。 gist.github.com</list<></t></t>