#+File Created: <2017-03-18 Sat 15:18>
#+Last Updated: <2018-02-21 Wed 19:19>

https://lectures.quantecon.org/jl/julia_essentials.html
をもとにして, julia 言語での書き方を見てみたのでその記録.
混乱は忘却の素ともいうので, 自分がちょっとだけ知ってる他の言語での書き方との違いを比較しながらみていこうと思う.


1 Common Data Types

まずは基本的な型についてみていく.
Julia は他の script 言語とひかくして
型の取扱いがちょっとめんどくさい印象.

1.1 真偽値

true, false は言語によって微妙に取扱いがことなる.
0 を true/false どちらに入れるかとか?
各言語でどーなってるのか比較.

1.1.1 julia

typeof: Bool
値: true, false

julia では Boolian 値は true, false (全部小文字)
0, 1 は自動で Bool に直してくれない(java と同じ).
いちいち convert(型, 値) としないといけないようです.

http://docs.julialang.org/en/release-0.4/manual/conversion-and-promotion/
julia のこの型指定, これからも色々と出て来るみたいだけどちょっと面倒なかんじ.

# true, false が予約語(小文字で書く)
x=true
println(x)

# 型は Bool 型
println(typeof(x))

# こんな感じでかける.
y= 1 > 2
println(y)

@printf("T+F = %d\n",true + false)
# 数値に直すと true は 1, false は 0
@printf("sum=%d\n",sum([true,false,false,true]))

#if(1) とかやると  error となる. 以下の様に書く必要がある.
if(convert(Bool,1))
    println("1 is true")
end

#if(0) とか書くとこれも error となる
if(convert(Bool,0))
    println("pass")
else
    println("0 is false")
end
true
Bool
false
T+F = 1
sum=2
1 is true
0 is false

1.1.2 perl

perl には, true, false に相当する語句がない?
0, '0', undef, '', (), ('') は false
それ以外は true

1: use strict;
2: use warnings;
3: # 参照:
4: # http://stackoverflow.com/questions/1036347/how-do-i-use-boolean-variables-in-perl
5: print "true\n"  if(1);
6: print "false\n" unless(0);
true
false

1.1.3 python

python は, True, False(一文字目が大文字)
1 は True. 0 は False

 1: if(True):
 2:     print("True")
 3: 
 4: if(False):
 5:     pass
 6: else:
 7:     print("False")
 8: 
 9: if(1):
10:     print("1 is True")
11: 
12: if(0):
13:     pass
14: else:
15:     print("0 is False")
True
False
1 is True
0 is False

1.1.4 R

R は TRUE, FALSE (全部大文字)
1 は TRUE, 0 は FALSE

 1: if(TRUE) {
 2:     print("TRUE")
 3: }
 4: if(FALSE) {
 5:     print("pass")
 6: } else {
 7:     print("FALSE")
 8: }
 9: if(1) {
10:     print("1 is TRUE")
11: }
12: if(0) {
13:     print("pass")
14: }else {
15:     print("0 is FALSE")
16: }
[1] "TRUE"
[1] "FALSE"
[1] "1 is TRUE"
[1] "0 is FALSE"

1.1.5 Ruby

Ruby は true/TRUE どっちでもいいのか?
他の言語と違い 0 は true!! (何かやな感じ)
false と nil 以外は true として扱われる.

 1: if(TRUE)
 2:     puts("TRUE")
 3: end
 4: 
 5: if(true)
 6:     puts("true")
 7: end
 8: 
 9: if(false)
10: else
11:     puts("false")
12: end
13: 
14: puts("FALSE")        unless(FALSE)
15: puts("nil is FALSE") unless(nil)
16: 
17: if(0)
18:    puts("0 is true!!")
19: end
TRUE
true
false
FALSE
nil is FALSE
0 is true!!

1.1.6 まとめ

微妙に違ってて間違えそう.
表でまとめておく.

言語 true を示すもじ 0 の扱い
julia true false (convert(Bool,0)
perl 1 false
python True false
R TRUE false
ruby true/TRUE true

もう既にまとめがあったのでこっちを参照した方がよいでしょう.
http://blog.mirakui.com/entry/20090604/truefalse

1.2 整数及び浮動小数点

1.2.1 julia

typeof: Int64, Float64

# 1.0 と書くと自動で Float64
# 1   と書くと自動で Int64
println("type of 1.0=",typeof(1.0))
println("type of 1  =",typeof(1))

x=2
y=1.0
# 自動で型を Float64 にしてくれる.
println("x*y=",x*y)
# 累乗は ^ で書く(** ではない. LaTeX 数式)
println("x^2=",x^2)
println("y/x=",y/x)
# 2*x は 2x と書ける(必要あるのかな...)
println("2x-3y=",2x-3y)
# +, * を関数とみなして後ろに引数, 的な書き方もできる.
# なるほど. 一貫してていいような.
println("10+20=",+(10,20))
println("10*20=",*(10,20))

# 複素数 im
# あんまり使わないと思うけどとりあえず書いておく.
x=1+2im
println("1+2i=",x)
y=1-2im
println("1-2i=",y)
x*y
println("x*y=",x*y)

# "" の中で変数を書かせたいときは, $変数 と書くとよい.
println("x=$x")
println("x+y=$(x+y)")
type of 1.0=Float64
type of 1  =Int64
x*y=2.0
x^2=4
y/x=0.5
2x-3y=1.0
10+20=30
10*20=200
1+2i=1 + 2im
1-2i=1 - 2im
x*y=5 + 0im
x=1 + 2im
x+y=2 + 0im

julia が他のと違うのは, 2x 的な表現で書けること位.
何か気持ち悪いので多分使わないと思うけど…

以下別の言語でどーかくのか.
累乗だけ書いておきます.

1.2.2 perl

use strict;
use warnings;
my $x=10;
my $y=$x**3;
print $y."\n";
1000

1.2.3 python

x=10
y=x**3
print(y)
1000

1.2.4 R

x <- 10
y <- x**3
y
z <- x^3  # これもいける!!
z
[1] 1000
[1] 1000

1.2.5 ruby

x = 10
y = x**3
puts y
1000

1.2.6 まとめ

一応まとめておきます.
julia だけ累乗は 2^3 みたいに書くらしい.
こういうオリジナリティいらないんだけどなー(注: R でも同じように書けるっぽい).
ついつい 2**3 って書いてしまいそう.

言語 累乗
julia 2^3
perl 2**3
python 2**3
R 2**3
ruby 2**3

1.3 文字列

typeof: String

文字列操作は自分の場合 perl でやったほうが早そう.
なので julia での書き方だけさらっと見ておく.

 1: # 文字列の連結には, 何と "*" を使う.
 2: # 何でこの記号なのか...
 3: # わからんけど何か深い理由があるんだろう.
 4: # つーか perl と同じ "." とか python, Java の "+" でいいような...
 5: fb = "foo" * "bar"
 6: println("concat foo and  bar = foo * bar: ",fb)
 7: 
 8: s="Charlie don't surf"
 9: # perl でもおなじみの split 関数
10: println(split(s))
11: 
12: # 文字列の置換
13: # この辺は実際に使うようになってから詳しく調べよう
14: println(replace(s,"surf","ski"))
15: 
16: # split(文字列,分割文字)
17: println(split("fee,fi,fo",","))
18: 
19: # trim
20: # 前後の空白取り除きには strip という関数がある.
21: println(strip(" foobar "))
22: 
23: # 文字列の中から数値をみつける.
24: println(match(r"(\d+)","Top 10"))
concat foo and  bar = foo * bar: foobar
SubString{String}["Charlie","don't","surf"]
Charlie don't ski
SubString{String}["fee","fi","fo"]
foobar
RegexMatch("10", 1="10")

1.4 タプル

1.4.1 julia

typeof: Tuple, Array

1: # tuple の宣言
2: # x = ("foo","bar") でもよい.
3: # x = "foo", "bar"  でもよい.
4: x=tuple("foo","bar")
5: println(x)
6: println(typeof(x))
7: w1, w2 = x
8: println(w1)
9: print(length(x))
("foo","bar")
Tuple{String,String}
foo
2

1.4.2 python

python での宣言

x=tuple([1,2,3])
y=(2,3,4)
z=x+y
print(z)
print(type(z))
print(len(z))
for p in z:
    print(p)
(1, 2, 3, 2, 3, 4)
<class 'tuple'>
6
1
2
3
2
3
4

1.4.3 まとめ

まとめ表です.

言語 宣言 長さ
julia tuple(1,2,3) length(x)
python tuple([1,2,3]) len(x)

1.5 配列

1.5.1 julia

julia では配列の添字は 1 はじまり!!

1: # 配列の宣言
2: x= [10,20,30,40]
3: println(x)
4: println(typeof(x))
5: println("x[end  ]=",x[end])
6: println("x[end-1]=",x[end-1])
7: println("x[1:3]  =",x[1:3])
8: println("x[2:end]=",x[2:end])
[10,20,30,40]
Array{Int64,1}
x[end  ]=40
x[end-1]=30
x[1:3]  =[10,20,30]
x[2:end]=[20,30,40]
# 文字列と配列
# 部分文字列
println("foobar"[3:end])
obar

配列に関する書き方いろいろ.

 1: # 配列について
 2: a=[1,2,3]  # 列ベクトル
 3: @printf("array a = %s\n", a)
 4: 
 5: # "," をつけないでかくこともできる.
 6: b=[1 2 3]  # 行ベクトルになる.
 7: @printf("array b = %s\n", b)
 8: 
 9: # 行列は以下のように宣言
10: mat=[1 4 7; 2 5 8; 3 6 9]
11: @printf("mat[2,1]  =%d\n",mat[2,1]) # 2 行 1 列目
12: @printf("mat[1,3]  =%d\n",mat[1,3])
13: @printf("mat[1,end]=%d\n",mat[1,end])
14: @printf("mat[4]    =%d\n",mat[4])
15: @printf("mat[end]  =%d\n",mat[end])
16: @printf("mat=%s\n",mat)
17: @printf("mat'=%s\n",mat')  # 転置行列 には ' をつける
18: @printf("mat'=%s\n",transpose(mat)) # transpose 関数でもよい
19: # exit()
20: 
21: col=[1,2,3] # 列ベクトル
22: row=[1 2 3] # 行ベクトル
23: 
24: inn=row*col # 1 つしか要素を持たない配列
25: @printf("inner product=%d\n",inn[1]) # 要素は 1 から始まる.
26: 
27: # 型の表示
28: println(typeof(inn))
29: 
30: # 配列初期化
31: xs = zeros(Float64,5)  # 配列を 0 で初期化
32: print("xs =")
33: println(xs)
34: 
35: xs2=[0.0 for i in 1:5] # リスト内包表記
36: @printf("xs2=%s\n",xs2)
37: 
38: x1=ones(Float64,5) # 1 で初期化
39: # x1=ones(5)       # Float64 は省略可能
40: @printf("x1=%s\n",x1)
41: 
42: # 単位行列
43: mt0=eye(Float64,3)
44: @printf("mt0=%s\n",mt0)
45: 
46: # 3x4 行列(初期化なし)
47: m34=Array(Float64,(3,4))
48: # 適当な値が入ってる
49: @printf("m34=%s\n",m34)
array a = [1,2,3]
array b = [1 2 3]
mat[2,1]  =2
mat[1,3]  =7
mat[1,end]=7
mat[4]    =4
mat[end]  =9
mat=[1 4 7; 2 5 8; 3 6 9]
mat'=[1 2 3; 4 5 6; 7 8 9]
mat'=[1 2 3; 4 5 6; 7 8 9]
inner product=14
Array{Int64,1}
xs =[0.0,0.0,0.0,0.0,0.0]
xs2=[0.0,0.0,0.0,0.0,0.0]
x1=[1.0,1.0,1.0,1.0,1.0]
mt0=[1.0 0.0 0.0; 0.0 1.0 0.0; 0.0 0.0 1.0]
m34=[2.22637e-314 2.22637e-314 0.0 0.0; 2.22619e-314 2.22619e-314 0.0 0.0; 2.22619e-314 2.22619e-314 0.0 0.0]

他言語との比較用

1: ar = [ i*2 for i in 1:9 ]
2: println(length(ar))
3: push!(ar,1)
4: unshift!(ar,2)
5: pop!(ar)
6: shift!(ar)
7: ax=[1,2]
8: append!(ar,ax)
9: println(ar)
9
[2,4,6,8,10,12,14,16,18,1,2]

1.5.2 perl

 1: use strict;
 2: use warnings;
 3: use Data::Dumper;
 4: 
 5: my $arr=[1 .. 9];
 6: @$arr = map {$_*2} @$arr;
 7: 
 8: print scalar(@$arr)."\n";
 9: push(@$arr,1);            # 後ろ くっつけ
10: unshift(@$arr,1);         # 前   くっつけ
11: pop(@$arr);               # 後ろ 削除
12: shift(@$arr);             # 前   削除
13: my @ax=(1,2);
14: push(@$arr,@ax);
15: 
16: print Data::Dumper->Dump([$arr]);
9
$VAR1 = [
          2,
          4,
          6,
          8,
          10,
          12,
          14,
          16,
          18,
          1,
          2
        ];

1.5.3 python

1: arr = [ i*2 for i in range(1,10)]
2: print(len(arr))  # 長さ
3: arr.append(1)    # 後ろにくっつける
4: arr.insert(0,2)  # 前(0 番目)にくっつける
5: arr.pop()        # 後ろを削除
6: arr.pop(0)       # 前(0 番目)を削除
7: ax = [1,2]
8: arr.extend(ax)   # 後ろにくっつける
9: print(arr)
9
[2, 4, 6, 8, 10, 12, 14, 16, 18, 1, 2]

1.5.4 R

R も添え字は 1 からはじまります.

 1: ar <- 2*seq(1:9)
 2: length(ar)
 3: 
 4: # push
 5: ar <- append(ar,1)
 6: # unshift
 7: ar <- append(ar,2,1)  # append(array,value,index)
 8: # pop
 9: ar <- ar[-length(ar)]
10: # shift
11: ar <- ar[-1]
12: # extend
13: ax <-c(1,2)
14: ar <-append(ar,ax,length(ar))
15: ar
[1] 9
 [1]  2  4  6  8 10 12 14 16 18  1  2

1.5.5 ruby

 1: arr = [*1..9]
 2: arr = arr.map {|i| i*2}
 3: puts arr.length
 4: arr.push(1)
 5: arr.unshift(2)
 6: arr.pop
 7: arr.shift
 8: ax = [1,2]
 9: arr.concat(ax)
10: print(arr)
9
[2, 4, 6, 8, 10, 12, 14, 16, 18, 1, 2]

1.5.6 numpy

 1: import numpy as np
 2: ar = np.array([ i*2 for i in range(1,10)])
 3: print(len(ar))
 4: ar = np.append(ar,1)
 5: ar = np.insert(ar,0,2)
 6: ar = np.delete(ar,-1)
 7: ar = np.delete(ar, 0)
 8: ax = [1,2]
 9: ar = np.append(ar,ax)
10: print(ar)
9
[ 2  4  6  8 10 12 14 16 18  1  2]

1.5.7 まとめ

書き方が似ててややこしいので以下にまとめておく.

言語 length push unshift pop shift extend
julia length(a) push!(a) unshift!(a) pop!(a) shift!(a) append!(a,x)
perl length(@a) push(@a,$x) unshift(@a,$x) pop(@a) shift(@a) push(@a,@x)
python len(a) a.append(x) a.insert(0,x) a.pop() a.pop(0) a.extend(x)
R length(a) append(a,1) append(a,x,1) a[-length(a)] a[-1] append(a,x,length(a))
ruby a.length a.push(x) a.unshift(x) a.pop a.shift a.concat(x)
numpy len(a) np.append(a,x) np.insert(a,0,x) np.delete(a,-1) np.delete(a,0) np.append(a,x)
js a.length a.push(x) a.unshift(x) a.pop() a.shift() a.concat(x)

1.6 辞書(hash)

1.6.1 julia

typeof: Dict

1: # tuple は小文字なのに Dict は大文字. おぼえにくい.
2: # {} ではなく () で囲む.
3: # アクセスは hash["key"] で, 配列と同じような書き方.
4: hash = Dict("name" => "Frodo", "age"=>33)
5: println(typeof(hash))
6: println("hash=",hash)
7: println("name=",hash["name"])
8: println("age =",hash["age"])
Dict{String,Any}
hash=Dict{String,Any}(Pair{String,Any}("name","Frodo"),Pair{String,Any}("age",33))
name=Frodo
age =33

1.6.2 perl

 1: use strict;
 2: use warnings;
 3: use Data::Dumper;
 4: my $hash={name=>'Frodo',age=>33};
 5: print Data::Dumper->Dump([$hash]);
 6: print $hash->{'name'}."\n";
 7: # print $hash->['name']."\n";  # エラーとなる.
 8: # 以下のようにも書ける.
 9: my %hash=(name=>'Frodo', agen=>33);
10: print $hash{name}."\n";
11: # print $hash['name']."\n";    # こんなふうには書けない.
$VAR1 = {
          'name' => 'Frodo',
          'age' => 33
        };
Frodo
Frodo

1.6.3 python

1: hash={'name':'Frodo','age':33}
2: print(hash)
3: print(hash['name'])
{'age': 33, 'name': 'Frodo'}
Frodo

1.6.4 ruby

1: hash = {'name'=>'Frodo','age'=>33}
2: puts hash
3: puts hash['age']
{"name"=>"Frodo", "age"=>33}
33

1.6.5 js

1: hash = {'name':'Frodo',age:33}
2: console.log(hash)
3: console.log(hash['name'])
{ name: 'Frodo', age: 33 }
Frodo

1.6.6 まとめ

以下に書き方をまとめる.
R はパッケージをインストールしないとダメっぽいので省略.
その代わり JavaScript をいれてみた.

言語 定義 アクセス
julia Dict(key:value) hash["key"]
perl {key=>value} $hash->{key}
python {key:value} hash["key"]
ruby {key=>value} hash["key"]
js {key:value} hash["key"]

2 Basic file I/O

ファイル書き込み
標準的な書き方でわかりやすい.
ファイルへの書き込みは print ではなく write

1: f=open("newfile.txt", "w")
2: write(f,"testing\n")
3: write(f,"more testing\n")
4: close(f)

ファイル読み込み
readall(f) でファイル中身を読み込み

1: f=open("newfile.txt","r")
2: x=readall(f)
3: print(x)
4: close(f)
testing
more testing

file 読み書きについてはまた別途.

3 繰り返し

3.1 julia

for 文は in を使って書く.
python みたいにいちいち ":" を使わなくてよい.
end で終わる ruby みたいな書き方.
終わりがはっきりしててわかりやすいとおもう.

1: actions = ["surf","ski"]
2: for act in actions
3:     println("Chalie don't $act")
4: end
5: 
6: for i in 1:3
7:     println(i)
8: end
Chalie don't surf
Chalie don't ski
1
2
3

Dictionary(hash) についての繰り返しもできる.

1: d = Dict("name"=>"Frodo","age"=>33)
2: println(keys(d))
3: println(typeof(keys(d)))
4: # collect で Array にする
5: println(collect(keys(d)))
6: println(typeof(collect(keys(d))))
String["name","age"]
Base.KeyIterator{Dict{String,Any}}
String["name","age"]
Array{String,1}
1: d = Dict("name"=>"hoge","age"=>32)
2: println(keys(d))
3: for k in keys(d)
4:     @printf("key=%s value=%s\n",k,d[k])
5: end
6: println(collect(keys(d)))
7: for k in collect(keys(d))
8:     @printf("key=%s value=%s\n",k,d[k])
9: end
String["name","age"]
key=name value=hoge
key=age value=32
String["name","age"]
key=name value=hoge
key=age value=32

どっちもけっかは一緒のようだ.

1: x_values=[1,2,3,4]
2: for x in x_values
3:     println(x*x)
4: end
5: 
6: for i in 1:length(x_values)
7:     println(x_values[i] * x_values[i])
8: end
1
4
9
16
1
4
9
16

二つの配列を同時に回すときは
zip という関数を使えばよいらしいです.
python の zip と同じ感じ.
便利.

1: countries=("Japan","Korea","China")
2: cities   =("Tokyo","Seoul","Beijing")
3: for (cont,city) in zip(countries,cities)
4:     println("The capital of $cont is $city")
5: end
The capital of Japan is Tokyo
The capital of Korea is Seoul
The capital of China is Beijing

python enumerate と同様な感じでも書けるみたい

1: countries=("Japan","Korea","China")
2: cities   =("Tokyo","Seoul","Beijing")
3: for (i,cont) in enumerate(countries)
4:     city = cities[i]
5:     println("The capital of $cont is $city")
6: end
The capital of Japan is Tokyo
The capital of Korea is Seoul
The capital of China is Beijing

以下比較用のるーぷ

1: for i in 1:9
2:     println(i)
3: end
1
2
3
4
5
6
7
8
9

3.2 perl

1: use strict;
2: use warnings;
3: 
4: my @ar=(1..9);
5: for (@ar) {
6:   print $_."\n";
7: }
1
2
3
4
5
6
7
8
9

3.3 python

range(1,10) と書くと 1 から 9 までな点にちゅういする.

1: for i in range(1,10):
2:     print(i)
1
2
3
4
5
6
7
8
9

3.4 ruby

1: for i in 1..9
2:   puts i
3: end
1
2
3
4
5
6
7
8
9

3.5 R

1: for(x in 1:9) {
2:     print(x)
3: }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9

3.6 js

1: var ar=[]
2: for(var i=1;i<10;i++) {
3:   ar.push(i);
4:   // console.log(i)
5: }
6: for(var x of ar) {
7:   console.log(x);
8: }
9: console.log(Array.from(new Array(9),(val,index)=>index+1));
1
2
3
4
5
6
7
8
9
[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

3.7 まとめ

for 文のかきかたまとめ.

言語 for 文 range 1 から 9 まで
julia for x in ar … end 1:9
perl for (@ar) {} (1..9)
python for x in ar: range(1,10)
ruby for x in ar … end 1..9
R for(x in ar) {} 1:9
js for(x of ar) {}  

3.8 内包表記

3.8.1 julia

julia でのリスト内包表記いろいろ

dbls = [2i for i in 1:4]   # 2x 的な書き方をつかってます
println(dbls)

anmls = ["dog","cat","bird"]
pls   = [a * "s" for a in anmls]  # * は文字列連結の意味であることに注意
println(pls)

# 内包表記で二次元配列も作れる
# python でも出来るんだろーか?
p = [i+j for i in 1:3, j in 4:6]
println(p)

# 辞書(hash) もこれで作れる
h = ["$i" => i for i in 1:3]
println(h)
[2,4,6,8]
String["dogs","cats","birds"]
[5 6 7; 6 7 8; 7 8 9]
Dict("1"=>1,"2"=>2,"3"=>3)

3.8.2 python

python でのかきかた

 1: dbls=[ 2*i for i in range(1,5)]
 2: print(dbls)
 3: 
 4: anmls = ["dog","cat","bird"]
 5: pls   = [ a + "s" for a in anmls]
 6: print(pls)
 7: 
 8: # 行列は無理っぽい
 9: # p = [i+j for i in range(1,4), j in range(4,7)]
10: 
11: # hash もそのままでは無理っぽい
12: # h = [ i=>i for i in range(1,4)]
[2, 4, 6, 8]
['dogs', 'cats', 'birds']

4 比較

4.1 julia

 1: x=1
 2: 
 3: # x==2 であるかどうか. false
 4: println(x==2)
 5: 
 6: # x が 3 じゃないかどうか. true
 7: println(x!=3)
 8: 
 9: # こんな感じでも書ける
10: println(1<2<3)
11: println(1<=2<=3)
12: 
13: # 上でもかいたけど 1 は自動で true に変換してくれない
14: if(convert(Bool,1))
15:     println("convert(Bool,1) is true")
16: end
17: 
18: # and と or
19: println(true && false)  # false
20: println(true || false)  # true
false
true
true
true
convert(Bool,1) is true
false
true

ごく簡単なれいでくらべてみよう.

4.2 perl

 1: use strict;
 2: use warnings;
 3: my $x=1;
 4: print($x==2); # 何と, 何も書き出されない(undef ってこと?).
 5: print("\n");
 6: print($x!=3); # 1
 7: print("\n");
 8: if($x) {
 9:    print("1 is true in perl\n");
10: }
11: print(1 and 0);   # 0
12: print("\n");
13: print(1 or  0);   # 1
1
1 is true in perl
0
1

4.3 python

 1: x=1
 2: print(x==2)
 3: print(x!=3)
 4: print(1<2<3)
 5: print(1<=2<=3)
 6: # 1 は true
 7: if(1):
 8:     print("1 is true in python")
 9: # and or はそのまま書けばよい.
10: print(True and False)
11: print(True or  False)
False
True
True
True
1 is true in python
False
True

4.4 ruby

1: x=1
2: puts(x==2)
3: puts(x!=3)
4: if(x)
5:     puts("1 is true in ruby")
6: end
false
true
1 is true in ruby

4.5 R

1: x <- 1
2: x==2
3: x!=3
4: if(x) {
5:     print("1 is true in R")
6: }
[1] FALSE
[1] TRUE
[1] "1 is true in R"

5 関数

5.1 julia

 1: function func(a,b)
 2:     return a*b
 3: end
 4: 
 5: # こんな感じでも関数を定義できる.
 6: f(x) = sin(1/x)
 7: 
 8: # default 値の設定
 9: function hoge(x,a=1)
10:      return exp(cos(a*x))
11: end
12: 
13: # keyword でアクセスする引数の指定. ";"
14: # a,b は普通にアクセス
15: # max, min は max=, min= としてアクセス
16: function fuga(a,b; max=5,min=2)
17:     x = a + b
18:     if(x>max)
19:        return max
20:     end
21:     if(x<min)
22:        return min
23:     end
24:     return x
25: end
26: 
27: k = func(2,5)
28: p = f(1.0)
29: q = hoge(pi)
30: r = hoge(pi,2)
31: c = fuga(2,4)
32: d = fuga(2,4,max=10)
33: println(k)
34: println(p)
35: println(q)
36: println(r)
37: println(c)
38: println(d)
10
0.8414709848078965
0.36787944117144233
2.718281828459045
5
6

5.2 まとめ

比較表だけかいてみる.
perl だけちょっとちがう感じ. 引数をかっこで渡さない.

  関数定義のやり方
julia function hoge() end
perl sub hoge { }
python def hoge()
ruby def hoge() end
js function hoge() { }

Comments