kmizuの日記

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

Klassic言語開発日誌 〜列多相(row polymorphism)〜

最近、Klassic言語をちょくちょく更新しているのですが、半月くらい前にオブジェクトに関係する型推論の仕組みを入れました。知っている人は知っていると思いますが、OCamlとかにあるアレです。たとえば、 def distance(p, e) = { // abs: Double => Double …

「構文解析ハンズオン」を開催しました(2017/07/01)

今まで、あまり見たことがない(一般エンジニア向け)勉強会で、かつ、これを学ぶことは実用上とても意味があるテーマの一つに「構文解析」があります*1。 たとえば、Webアプリケーションにおいて、ユーザの入力に大して何らかの構文的制約をつけてバリデー…

技術イベント「Understanding Scala」を開催しました(6/10)

Understanding Scala - connpass 昨日、表題の技術イベントを自分主催で行いました。なんでこんなイベントをやろうと思ったかというと「皆、Scalaを難しくめんどくさい方法で学んでるのでは?」という疑問が自分の中であって、その原因として、サンプルプロ…

高階多相か高カインド多相、どちらが適切な用語かを考える

タイトルだけだと、わかってる人にしかわからないので、背景を説明します。サンプルコードはScalaですが、同じ機能はHaskellにもあります(あとは、C++のテンプレートテンプレート引数もこれに該当します。もうちょっとマイナーな言語だと他にいくつもありま…

Scala福岡2017で登壇してきます(2017/07/29(土))

Scala福岡主催のイベント、Scala福岡2017で登壇依頼をいただいたので、発表してきます。 詳しくは以下: scala.connpass.com 今のところ、セッション参加枠がまだまだあるようなので、九州あるいは九州近辺在住で、Scalaについて興味のある方等、参加を検討…

Klassic言語の現状のステータス

Klassic は自分が新たに去年くらいから開発し始めたプログラミング言語です。 まだ確固たる設計思想があるわけではなく、色々な構文や機能について試しに導入してみて、テストを書いて…みたいなのを繰り返してる 段階です。現状のKlassic言語の大雑把な特徴…

型クラスの真の力を見せる

昨日、 kmizu.hatenablog.com という記事を書いたわけだが、その後、今日、型クラスに関する議論が一部で(?)盛り上がっているようだ。それは型クラスじゃなくても実現できるのでは、いや、やっぱりインタフェースのようなものと思っていいのでは、などな…

型クラスをOrderingを用いて説明してみる

ちょっと今日は疲れてるので、表題の件について、簡単に書いてみる。私の経験上、型クラスにおける、最も多い誤解は、(Javaとかにおける)インタフェースのようなもの、というもので、これはかなり多くの人にみられるように思う。 まず、そもそも、何故そう…

シンフォニック=レインというゲームをお勧めしてみる(注意:ネタバレは見ないで)

このブログでオタク系の話題を書くのは、もしかしたら初めてかもしれませんが、表題のゲームのSteam版が発売されるというニュースを見つけたので、このゲームが好きな人間としてこれを機会に布教しとこうかと思って筆をとりました。 シンフォニック=レイン…

Scalaでimplicits呼ぶなキャンペーン

はじめのはじめに implicitsは可読性が…という人が居たら、この記事へのリンクを教えてあげていただければと思います TL;DR Scalaには俗に「implicits」と呼ばれる機能がある 実際にはそれらは3つの機能をまとめて指す用語である それぞれの機能は全く異な…

Rubyっぽく楽にIO処理を書けるライブラリScaruby 0.3をリリースしました

Scalaは標準IOライブラリが非常に貧弱な言語です。scala.ioはまともに使えるものではありませんし、JDKのライブラリのIOを使うのも面倒です。そこで、サードパーティのIOライブラリを使うことになります。そこで、いくつかサードパーティのIOライブラリを見…

Scalaに関する誤解と事実を語る

TL;DR 世間のScalaに関するイメージは、昔のままであることが多い 昔のままどころか、最初から間違ったイメージを持たれていることも多い 実際には、既に解決されている問題は多々あるし、改善に向かっていることも多い プロジェクト管理の問題を言語に押し…

Dottyで自作言語Klassicの処理系をビルドしてみる

つい先日、Scala 3になることが決定した次世代ScalaコンパイラDotty。このDotty、まだときどきコンパイラがクラッシュするなどのバグはありますが、Scala 2.11のライブラリを使うことができるので、Scala 2.11対応のライブラリやプロダクトを試しにビルドし…

ジョギングを再開

かなりどうでもいい話なのですが、一応の区切りとしてここに記す。ちょっと最近身体の衰えを感じることが増えてきたので、今日からジョギングを再開する ことにした。とりあえず、だいたい2日おきに3kmくらいのジョグを1ヶ月続けて、その次は4kmを1ヶ月、…

TwitterはScalaを捨ててません(少なくとも現在は)

なんだかTwitterの一部で www.utali.io の記事が話題になってるようですが、はっきり言って誤情報です(というか、何故そんな誤解をしたのか知りたいくらい)。根拠はいくつかありますが Twitterは最近(ここ数ヶ月)にScala CenterのAdvisory Boardにjoinし…

プログラミング言語作成ハンズオンを開催しました

connpass.com 今回開催したこのイベントは、私が学習用に作成したプログラミング言語nub github.com の文法や機能拡張を通じて、プログラミング言語処理系の作成の基礎について学ぶというものでした。 自分がこのイベントを開催したねらいは主に二つあって、…

正規表現のようでそうでない文字列マッチングライブラリ PEGEX 0.3リリース

PEGEXを開発し始めたのが確か2010年の春頃でした。元々は、私の専門であるPEGに対してより正規表現ライクな記法をサポートしたものでした。それから6年、現在は既にPEGのセマンティクスはほとんど残っておらず、(おそらく)全ての文脈自由言語を扱えるよう…

歯の健康を守ろう

この記事は、健康Advent Calendar 2016 12/13の記事です。 皆さん、歯、大丈夫ですか?自分は最近、右上の親知らずが虫歯にかかっていることが判明して抜歯する羽目になりました。ついでに、虫歯の治療も同時にしたせいで、一週間、左側の歯だけで飯を食わな…

Java (8)によるパーザコンビネータライブラリ JCombinator 0.0.1をリリースしました

Javaには既にJParsecというパーザコンビネータライブラリもあり、あえて新しいものを作る必要はないかもしれません。 ただ、JParsecはイマイチ気に入らなかったので、新しいパーザコンビネータライブラリを作ってみることにしました。とりあえず、基本的なコ…

Kotlin Internal勉強会を開催しました

connpass.com 数ヶ月前からKotlinをちょくちょく触っていて、「もっと深いところを知りたいな」と思ったので開催することにしたのがこの勉強会です。さすがにInternalとついていたせいか、それほど参加者は多くなかったですが、かえって質問しやすい空気にな…

Klassic開発日誌(2016/11/20): Hindley-Milner型推論はじめました

以前、 kmizu.hatenablog.com という記事を書いたことがあったのですが、このときはまだ多相型を実装しておらず、Dynamicという謎の型でごまかしていましたが、その辺の制限をとっぱらいましたという話です。 型推論というと、最近はやりの言語はだいたい型…

Kotlinのコレクションに対してstreamメソッドが呼び出せない

Java 8でjava.util.Collectionに追加されたメソッドとして、Streamを返すstream()メソッドがあります。これ、java.util.Collectionに追加されたメソッドなのだから、当然Kotlinでも呼び出せて良いはずですが、実はできません。 >>> val x = listOf(1, 2, 3, …

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

しばらく触っていなかったのですが、ふと思い立って、データ構造を追加してみました。 具体的には、 TreeMap: 赤黒木ベースのMap TreeSet: 赤黒木ベースのSet の二つを追加しました。実装はほとんど、Scala版のRedBlackTreeのポーティングですが、is乱発しな…

Kotlinのnullable typeはzero overheadではありません

タイトルの通りなんですが、JetBrainsさんが公式で Zero-overhead null-safety とか書いているおかげで信じている人もいるかもしれません。ですが、それは正しくありません。 試しに、次のコードをコンパイルしてみましょう。 fun double(x: Int?): Int = x?…

Klassic開発日誌(2016/10/08):型チェックはじめました

冷やし中華はじめました、みたいなこと書いてみたかっただけです。はい。 これまでKlassicでは、メインのインタプリタは(あとで静的型をつけることを意識しつつ)動的型言語でしたが、少しずつ静的型を加えていっています。現在のところ、まだ多相型を扱え…

JSONのようでそうでないデータフォーマットNSON 0.0.1リリース

きっかけは、昨夜の思いつきでした。 今日ふと思ったこと: JSONって、そもそもカンマ要らないんじゃね?{ "Foo" : "BAR" "BAR": "Baz" "Hoge" : { "name" : "Hoge" } }特に曖昧性なくパーズできるように思える。配列も同じく。— Kota Mizushima (@kmizu) 20…

Onion開発日誌/2016/11/05 単一式を本体として持つメソッドや関数定義を可能に

最近、Klassicと同時にOnionもちょくちょく更新するようになったので、変更点など書いていこうと思う。 今日は、メソッドや関数定義に、文ではなく式を取れるようにする改良を行った。今どきの言語だと当たり前だが、Onionを最初に開発した2004-2005年の時点…

Scala初学者はvarを使っても良い

TwitterでScala関係のつぶやきをみていると、どうも、特に初学者の方に、 varを使ってはいけないので、Scalaは難しい… という意見が散見されるようです。 しかし、Scalaを学び始めのときにいきなりvarを断つ必要はなく安心してvarを使ってもいいと思います …

Elixirを学んでみる(1) - parser combinator

最近、Elixirがなんとなく盛り上がってきている気がするので、この機会に入門してみることにした。お題は相変わらずparser combinator。解説はめんどうくさいのでコードだけ貼り付けておく。 わかったこと。 Elixirの文法は結構くせがある。文法はRubyに影響…

Kotlinの謎(解明編)

今日書いた kmizu.hatenablog.com についてですが、原因がわかりました。まずは以下のコードを見てください Welcome to Kotlin version 1.0.0 (JRE 1.8.0_91-b14) Type :help for help, :quit for quit >>> val a: () -> Int = { 2 } >>> val b: () -> Unit …

Kotlinの謎

Kotlinという言語の型システムは凄くおおざっぱに言ってしまうと、Scalaと非常によく似ています。 TopがAny BottomがNothing Byte, Short, Int, Float, ....といった、プリミティブ型相当の型が継承階層に組み込まれていて、型名まで同じ Generics Declarati…

Macro PEG 0.0.10 リリース

かなり久しぶりのリリースです。主な変更点は、 Conflict between an expression parenthesis syntax and call syntax · Issue #16 · kmizu/macro_peg · GitHub を修正した点でしょうか。これで、 STRING = STRING_MACRO("\"") / STRING_MACRO("'"); STRING_…

Scalaの学習コストを下げるための心得

追記:Twitterで、「それって、言語マニアにしかできない技のような気が」という指摘を受けました。自分としては一般的に適用可能な話だと思っていますが、あるいは自分の感性が著しくずれているのかもしれません。その辺承知の上でお読みください。 Scalaは…

これまでの人生で一番、死を身近に感じたときのこと

とても物騒なタイトルがついていますが、別に自殺しかけたとか事件に巻き込まれたという話ではありません。 大学1年生の夏(2002年)の事でした。当時、筑波大学1年生だった自分は、サークル(?)の先輩たちとともに、今ではガルパンの聖地として知られて…

Scalaアンチパターン:変更可能コレクションをvarとして宣言する

Scalaは最初から関数型プログラミングのスタイルで書くことを意識して設計されたという意味で関数型プログラミング言語と言えますが、一方で、「Better Java」な手続き型スタイルで書くことも基本的には否定されるべきではないと思います。たとえば、ビッグ…

個人的に好き(な/だった)技術書籍10選

「プログラマのための技術書籍○選」とかよく見るじゃないですか。あれ、自分はどうにも好きになれないというか、後進を自分がたどってきた道に引きずり込みたいだけじゃねーかと思うのが多いです(全部がそうだとは言いません)。なので、今回のエントリでは…

Scalaスケーラブルプログラミング第3版(電子版も)が発売されます(2016/09/20)

通称コップ本こと、Scalaスケーラブルプログラミングの第3版が今月下旬発売されます。今回のウリはなんといっても、Scala 2.11(2.12のSAM変換も)対応です。また、第3版なので(?)コップの数が3個に増えています。 Scala 2.11対応なので、String Interp…

ScalaとKotlin(と昔のJava)のジェネリクスが壊れている理由

表題の通りです。とりあえず、Kotlin版とScala版のコード貼ります。 gist.github.com gist.github.com これらのコードでは、両方とも明示的なダウンキャストやその他の抜け穴を使っていないので、実行しても決してClassCastExceptionが起きてはいけないので…

SWoPP2016での発表「PEGのパラメタ付き拡張 Macro PEGの提案」のスライド

先日、8/8-8/10に、長野県の松本で行われたSWoPP2016 sites.google.com に発表&参加してきました。SWoPP2016は複数の研究会が一同に集まって行われるワークショップですが、自分はその中でもプログラミング研究会(PRO)で発表してきました。その発表スライド…

自分のTwitterの使い方を考え直す

自分ははっきり言って重度のTwitter依存症であり、何かあるとすぐTwitterを見る癖がついてしまった。まあ、それはいい。ただ、その使い方があまりにも節操がないので、いらんいざこざを招いているなと自覚するようになった。 たとえば、自分は、興味のある分…

オーバーロードされたメソッドをeta-expansionする (2)

kmizu.hatenablog.com を読み返していて、これ、 val add: (Double, Int) => Double = O.add で行けるんだから、そもそも_が要らなくて O.add:((Double, Int) => Int) でいけるのでは?と思って書いてみたら動いたという話です。要はメソッド型の式(O.addは…

私のTwitterの使い方

Twitterを始めたのが自分のプロフィールみると2007年春ということなので、Twitterを始めてかれこれ9年になります。というわけで(?)、自分の普段のTwitterの使い方をいくつかに分類して振り返ってみようと思います。 ライフログとして これが自分の中では…

オーバーロードされたメソッドをeta-expansionする

eta-expansionとは、メソッドを関数に変換する処理です。 たとえば、 def add(x: Int, y: Int): Int = x + y val addFunc = add _ で、add _によって、eta-expansionが行われ、メソッドaddが関数に変換されます。このeta-expansion、メソッドがオーバーロー…

そういえば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 きょんさんから、出演依頼があったのと、これからあちこちでなんか発表したいなーという気分があったので発表することにしました。 タイトルは「私のプログラミング言語の学び方」です…