Skip to content

Instantly share code, notes, and snippets.

View kmizu's full-sized avatar

Kota Mizushima kmizu

View GitHub Profile
@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かどうかのチェックを忘れたとしても、コンパイルエラーになってくれる。
object StringLiteralType {
def isAType(arg: String): Unit = arg match {
case _ : "a" => println("This is `a` type")
case _ => println("not `a`")
}
def a1 = isAType("a")
def a2 = isAType(new String("a"))
def a3 = new String("a").isInstanceOf["a"]
object StringLiteralType {
def isAType(arg: String): Unit = arg match {
case _ : "a" => println("This is `a` type")
case _ => println("not `a`")
}
def a1 = isAType("a")
def a2 = isAType(new String("a"))
def a3 = new String("a").isInstanceOf["a"]
public class LargeStringInterpolation {
public int a();
Code:
0: aload_0
1: getfield #15 // Field a:I
4: ireturn
public java.lang.String s33();
Code:
0: aload_0
object LargeStringInterpolation extends App {
val a = 1
val s32 = s"$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a"
val s33 = s"$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a"
val s34 = s"$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a"
val s35 = s"$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a$a"
println("Hello")
}
@kmizu
kmizu / A.scala
Created July 29, 2019 15:11
A.scala
class A {
def foo(x: Int): Int = 1
}
@kmizu
kmizu / BehaviorOfFinal.scala
Last active July 12, 2019 05:55
Effect of explicit final modifier for an object definition (it depends on scalac's implementation detail)
final object ExplicitlyFinalObject {
val NonFinalVal = 1
final val FinalVal = 2
}
object ImplicitlyFinalObject {
val NonFinalVal = 1
final val FinalVal = 2
}
@kmizu
kmizu / M.hs
Created July 8, 2019 05:35
Ambiguous occurrence
class M a where
(+) :: a -> a -> a
add x y = x + y
main = do print "Hello"
@kmizu
kmizu / Nesting.scala
Created March 11, 2019 03:47
Parses parens
sealed abstract class Nest
case class NLeaf(code: Char) extends Nest
case class NList(elements: List[Nest]) extends Nest
def group(tokens: List[Char]): List[Nest] = {
def process(nest: List[Nest], acc: List[Nest], remain: List[Char]): (List[Nest], List[Nest], List[Char]) = {
remain match {
case Nil =>
(nest, Nil, Nil)
case ('(')::rest =>
@kmizu
kmizu / Hello.sc
Created March 7, 2019 11:33
Syntax Highlighting Test
object Hello extends App {
def main(args: Array[String]): Unit = {
println("Hello")
}
}