kmizuの日記

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

そういえばOnionにもあるClass Delegation

先日、Kotiln勉強会というものに行って来ました。まあ、自分の発表は拙作kollectionライブラリの発表という割とどうでもいいものでしたが、それはそうとKotlinエバンジェリストたろーさんがClass Delegationという機能について紹介していました。 speakerdec…

Kotlin用不変コレクションライブラリkollection 0.3リリース

今回のリリースでは、不変キューを追加しました。 github.com これは各操作の償却計算量が定数時間のキューで、非償却計算量で定数時間にはなっていないので改良が必要なのですが、とりあえず実装が手っ取り早かったのでまずはこちらを実装しました。リアル…

Nim勉強日誌(1) Hello, Parser Combinator!

そろそろ新しい言語に触れないとなあということでこれまでちらっと見たことがあったプログラミング言語Nim index - Nim Programming Language を触ってみることに決定。(1)とついていますが、これで飽きてやめるかもしれませんが悪しからず。 Python風味のイ…

PEGでa1 + a2 + ... + an = bを判定する

このネタは parser.connpass.com でToshihiro Kogaさんに教えてもらったもので、私のオリジナルではないのですが、ちょっとおもしろいので貼ってみます。 まず、非負整数nについて、1の出現数によってエンコードします。 0 = 1 = 1 2 = 11 3 = 111 4 = 1111 …

プログラミング言語の好き嫌いと人の好き嫌いは別物である

という至極当然のことを改めて言っておきたいです。 たとえば、自分は今はScalaをメイン言語として使っていて、Javaの色々な部分がイケてないなーと感じることは多々あり、時折ディスることもありますが、Javaユーザを見下したりしたことはないと思っていま…

Klassic言語の開発状況

リテラル Byte Short Int Long Float Double Boolean Unit String 演算 加減乗除、比較、論理演算、などなど。異なる数値型の暗黙変換は禁止(Int + LongなどはNG) リスト [ [1 2 3] [4 5 6] [7 8 9] ] こんな風に、改行だけでなく空白がセパレータになるこ…

プログラミング言語基礎勉強会で発表してきます

明日(6/11(土))に、こういう勉強会があるのですが、 xbase.connpass.com きょんさんから、出演依頼があったのと、これからあちこちでなんか発表したいなーという気分があったので発表することにしました。 タイトルは「私のプログラミング言語の学び方」です…

斜め読み論文紹介(1)「From APIs to Languages: Generalising Method Names」

タイトルは、斜め読み論文紹介ですが、 togetter.com ↑の辺の企画の亜種だと思ってください。気が向いたらときどき書いていこうと思います。第一回は、From APIs to Languages: Generalising Method Namesです*1。 唐突ですが、Smalltalkという言語がありま…

お役立ち中置パターン in Scala

Scalaには中置パターン(infix pattern)と呼ばれる機能があります。これは単純にいうと、 case class ~[A, B](a: A, b: B) のようにして定義したケースクラスに対して*1、 scala> val ab = new ~(1, "FOO") ab: ~[Int,String] = ~(1,FOO) scala> val a ~ b …

Amazon Prime Nowは確かに速かった

昨日、Amazon Prime Nowの存在を知り、送料を余計に支払えば1時間以内、無料枠でも2時間以内に注文した品を届けてくれるサービスであることを知った(該当エリアに住んでいることが条件。また、専用のPrime Nowアプリで注文する必要がある)。注文できる品物…

今更ES2015の勉強を始めてみた

タイトルの通りです。JavaScriptに関しては多少は知っていますが、知識が全然アップデートされていないので、この機会に再入門してみることにしました。以下はpackage.jsonなんかBabel関連で試行錯誤したので、結構変な構成になっているかも。 { "name": "es…

scala-nativeのサンプルプログラムをLinuxで動作させる場合の注意点

kmizu.hatenablog.com についての補足的なエントリです。scala-nativeのサンプルプログラムsmallpt.scalaは __stderrpを使っていますが、Linux系には存在しないので、リンク時にこけてしまいます。 これを修正するには、smallpt.scalaとstdlib.scalaの__stde…

scala-nativeでは相互末尾再帰呼び出しも最適化される

Scala Nativeなのかscala-nativeなのか迷ったのですが、今後はリポジトリ名のscala-nativeに統一しようかと思います。さて、タイトルについてですが、そのまんまです。 サンプルコードは以下: gist.github.com 通常のJVM上でのScalaでは、末尾呼び出しが自…

Scala Nativeを動かしてみた(1)

Scala Nativeはscalaのコードを(LLVMのIRを経由して)ネイティブコードにコンパイルするAOTコンパイラ(Ahead Of Time Compiler)です。その存在については、少し前にサイトができていたことで一部で話題になっていましたが、Scala Days 2016 NYCにて正式に…

Kotlin用不変コレクションライブラリ kollection 0.2リリース

リストベースの集合であるKListSet リストベースのマップであるKListMap 遅延評価を提供するKLazy のサポートを追加しました。また、必要になった時点で、KListにもメソッドを随時継ぎ足していってます。詳細についてはREADMEを参照ください。 github.com

Kotlinでメソッド定義にrunを使う意義

Kotlinにはrun というメソッドがstdlibにあります。これ、定義をみると、 @kotlin.internal.InlineOnly public inline fun <R> run(block: () -> R): R = block() 引数で渡された0引数ラムダ式(とKotlinの用語法に従っておく)をそのまま呼び出すだけというも</r>…

stripMarginの歴史

ScalaのString(正確にはStringOps)にはstripMarginというメソッドがあります。これは、主に複数行文字列に使われる機能で、たとえば、 """|class Hello { | |}""".stripMargin のようにすると、 res0: String = class Hello { } という文字列が得られ、行頭…

Kotlin用不変コレクションライブラリ kollection 0.1リリース

ちょっと前から少しずつ作っていたのですが、最低限の機能はそろったので公開してみることにしました。Kotlinの標準ライブラリのコレクションは読み取り専用ビューは提供してくれるものの、不変コレクションがないのが不満だったので作ってみようというのが…

Scala 2.12.0-M4とJava 8 Streamで遊んでみる

Scala 2.12.0-M4はまだ正式リリースはされていませんが、既に各種バイナリはpublishされており、sbtに次のようにscalaVersionを書いてあげればふつうに使うことができます。 scalaVersion := "2.12.0-M4" さて、Scala 2.12の一つの目玉がSAM Type(Single Abs…

gitbook-plugin-regexplaceを利用して、ブロックレベル要素でMarkdownを囲む

GitBookは、色々な電子フォーマットで出力するドキュメントのためのツールです。 github.com GitBookは紹介記事がたくさんあると思うので、説明は割愛しますが、このツール、主な記述言語としてMarkdownを採用しています。Markdown自体は色々な独自拡張があ…

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以…