Open7
Juliaバッドハック
ピン留めされたアイテム
> 1 |> ((x)(x=(;x=x)(x;))=((;x)(x=x;)=x)(x))
1
要素1
(x,)(y) = (x,y)
(;x)(y) = (x,y)
が無名関数として以下と同等に解釈される
function f1(y)
(x,) = f1
return (x,y)
end
function f2(y)
(;x) = f2
return (x,y)
end
要素2
(x -> ((_=x,)->()).x)(1)
Closerはfieldを持つので分割代入でxが取れる
要素3
((x=デフォルト引数は実行時に評価されるので文法的に明らかに誤りでなければ適当書いて良い)->x)(1)
function a()
b() = println("hi")
return
end
function c()
Vector{var"#b#1"}(undef, 1)[1]()
end
c() #hi
よりキモく見えるように
function a()
map(x -> x + 1, 1:10)
end
println(a()) # [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
gl = names(Main, all=true)
ft = eval(gl[findall(==(Symbol("#a")), gl)[1] - 1])
(::ft)(x) = x * 2
println(a()) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
上でVector使ってるのは
Ref{var"..."}()[]
で取れるし、
var"...".instance
でも取れる
でも後者では取れないのもある
for f() in 1:2 end
でfはtypeがvar"#f#1"{Int}とかの関数になる。
でも
var"#f#1"{Int}.instance
はundef
Ref{var"#f#1"{T}}()[]()
はRef{T}()[]を返してる(たぶん)
無名関数(匿名関数)の定義方法
- 標準的
function (a,b;c,d)
a,b,c,d
end
(a,b;c,d)->(a,b,c,d)
identity() do a,b
a,b
end
- 標準的でない方法
(a,b;c,d) where{}= (a,b,c,d)
begin
a
c
end where{} = (a,c)
()(a,b;c,d) = (a,b,c,d)
()
への代入操作は無視される
> () = 0
0
> Meta.lower(Main, :(()=0))
:($(Expr(:thunk, CodeInfo(
@ none within `top-level scope`
1 ─ %1 = 0
└── return %1
))))
> ()::Tuple = 0
0
> Meta.lower(Main, :(()::Tuple=0))
:($(Expr(:thunk, CodeInfo(
@ none within `top-level scope`
1 ─ %1 = Core.tuple()
│ Core.typeassert(%1, Tuple)
│ %3 = 0
└── return %3
))))