Skip to content

Instantly share code, notes, and snippets.

View kmizu's full-sized avatar

Kota Mizushima kmizu

View GitHub Profile
@kmizu
kmizu / reverse.rb
Created November 10, 2019 06:09
Use Ruby 2.7's pattern matching
def reverse(xs)
case xs
in [y, *ys]
reverse(ys) + [y]
in []
[]
end
end
@kmizu
kmizu / README.md
Last active April 30, 2023 13:13
Blawnの文法について

ソースコード読んだり、実際に処理系を動かしてみたメモを残しておきます。内容は当然ながら無保証です。 基本的に難しいことはやっていないので、ソースを読めばだいたいわかります。

処理系

C++で書かれている。

字句解析(flex) → 構文解析(bison)→ コード生成(LLVM IRを生成)

って感じで特に変なことはしていない。LLVM IR使っているというのが今どきぽいけど。

@kmizu
kmizu / Main.scala
Created September 11, 2019 04:06
Usage of existential type in Scala
object Main {
class MyArray[A:Manifest](size: Int) {
private[this] val elements = new Array[A](size)
def get(index: Int): A = {
elements(index)
}
def set(index: Int, element: A): Unit = {
elements(index) = element
@kmizu
kmizu / Map.scala
Created September 8, 2019 12:05
Pure `map` method using destructive operations
def map[A, B](xs: List[A])(f: A => B): List[B] = {
var ys = xs
val result = collection.mutable.Buffer.empty[B]
while(ys != Nil) {
result += f(ys.head)
ys = ys.tail
}
result.toList
}
@kmizu
kmizu / PEG.scala
Created September 7, 2019 14:38
Describe Core PEG and Full PEG using GADTs
object PEG {
sealed trait Category
class Full extends Category
final class Core extends Full
sealed trait Expression[+A]
case class Alpha(ch: Char) extends Expression[Core]
case class Choice[+A <: Category](lhs: Expression[A], rhs: Expression[A]) extends Expression[A]
case class Sequence[+A <: Category](lhs: Expression[A], rhs: Expression[A]) extends Expression[A]
case class Repeat0[+A <: Category](body: Expression[A]) extends Expression[A]
@kmizu
kmizu / Monadic.java
Created August 30, 2019 17:33
define List Monad for java.util.List
import java.util.*;
import java.util.stream.*;
import java.util.function.*;
public class Monadic {
// define List Monad
public static class ListMonad<T> {
public List<T> unit(T x) {
return List.of(x);
}
@kmizu
kmizu / TernaryOperator.scala
Created August 27, 2019 05:39
User-defined Ternary Operators in Scala
object TernaryOperator extends App {
case class Fragment[A](condition: Boolean, thenClause: () => A) {
def >(elseClause: => A): A = if(condition) {
thenClause()
} else {
elseClause
}
}
implicit class RichBoolean(self: Boolean) {
def ?[A](thenClause: => A): Fragment[A] = Fragment(
@kmizu
kmizu / test.md
Last active August 20, 2019 14:28
Markdown in Markdown

A1

# A2

```markdown

# A3
@kmizu
kmizu / console.txt
Created August 10, 2019 14:44
Nullability in Nice (0.9.13)
[Mizushima]$ cat hello1/hello1.nice
import java.util.*;
void main(String[] args) {
let value = System.getProperty("hello");
assert value != null;
System.out.println(value.length());
}
~/work
@kmizu
kmizu / diary.txt
Created August 8, 2019 07:47
2004/09/09の自分のWeb日記
以前にちょっとだけ触ってみたNiceについて調べてみる。  Niceは、Javaをベースに高階関数、マルチメソッド、パラメータ型、キーワード引数、省略可能引数、Option Typesなどの機能を追加した言語で、処理系は、Java VM用のコードを吐くコンパイラとなっている。
マルチメソッド、キーワード引数などは、他の言語でもよく見かけるが、 Option Typesは、他の言語ではあまり見かけない機能だ。Option Typesとは、値としてnullを許す型で、それだけ見ると、珍しくもなんともないのだが、Niceでは面白いことに、変数の型はデフォルトでnullを代入できないのだ。例えば、以下のようなコードを書くと、sはnullを代入できない型になり、もしsにnullが代入され得るようなコードを書くと、コンパイルエラーになる。
let String s = "Hello";//nullは代入できない
もし、nullを代入可能にしたければ、型名の頭に'?'を付けて、次のように宣言する。
let ?String s = "Hello";//nullが代入可能
この機能は、大変面白い機能なんじゃないかと思う。例えば、Mapにキーを与えて値を取得するとき、返って来た値がnullかどうかをチェックする必要がある場合は多いが、この機能があれば、もし仮にnullかどうかのチェックを忘れたとしても、コンパイルエラーになってくれる。