ソースコード読んだり、実際に処理系を動かしてみたメモを残しておきます。内容は当然ながら無保証です。 基本的に難しいことはやっていないので、ソースを読めばだいたいわかります。
C++で書かれている。
字句解析(flex) → 構文解析(bison)→ コード生成(LLVM IRを生成)
って感じで特に変なことはしていない。LLVM IR使っているというのが今どきぽいけど。
def reverse(xs) | |
case xs | |
in [y, *ys] | |
reverse(ys) + [y] | |
in [] | |
[] | |
end | |
end |
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 |
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 | |
} |
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] |
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); | |
} |
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( |
[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 |
以前にちょっとだけ触ってみた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かどうかのチェックを忘れたとしても、コンパイルエラーになってくれる。 |