by shigemk2

当面は技術的なことしか書かない

sbtでプロジェクトを作る mk2 json4s-native

build.sbt

libraryDependencies += "org.json4s" %% "json4s-native" % "3.2.4"

test.scala

import org.json4s.native.JsonMethods._
import org.json4s.DynamicJValue._

object Main {
  def main(args: Array[String]): Unit = {
    val abc = parse("""{ "a" : { "b" : { "c" : [1,2,3] } } }""")
    val de = parse("""{ "e" : "e" }""")
    println(abc \\ "a")
    println(abc \\ "b")
    println((abc \\ "c")(1))
    // println("test start")
  }
}

こういうふうに書く。そしてsbt

anyenvを入れてみよう

ソース

riywo/anyenv · GitHub

超平たくいうと、pyenv rbenv phpenvなどのenv系を一括管理する究極のenvである。

導入

蝶☆簡☆単

$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.your_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.your_profile
$ exec $SHELL -l

env系インストール。

$ anyenv install rbenv
$ anyenv install plenv
$ anyenv install pyenv
$ anyenv install phpenv
$ anyenv install ndenv
$ anyenv install denv
$ anyenv install jenv
$ anyenv install luaenv

実行順序に気をつける感じのやつ

// fetch 中で変数の値を書き換えているので副作用が発生する
let fetch() =
    let ret = read16 mem pc
    pc <- pc + 2
    ret

let opr1, opr2 = fetch(), fetch()  // このような書き方だと環境依存で実行順序が保証されない

副作用のある関数の結果を、上のような方法で複数の変数に同時に代入すると、 環境によって実行順序が変わることがあるので、opr1とopr2の中身がそのときどきに よって違うことがあるため、推奨されない。

これはF#だけの話ではなく、他のプログラミング言語にも言える。

追記

F#は環境依存で実行順序が変わることはない。

でも一般的な話として、環境依存で想定外の動きをするような書き方をするべきではない。