Open7

Juliaバッドハック

ピン留めされたアイテム
watosarwatosar
> 1 |> ((x)(x=(;x=x)(x;))=((;x)(x=x;)=x)(x))
 1
watosarwatosar

要素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)
watosarwatosar
function a()
    b() = println("hi")
    return
end

function c()
    Vector{var"#b#1"}(undef, 1)[1]()
end

c() #hi
watosarwatosar

よりキモく見えるように

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]
watosarwatosar

上で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}()[]を返してる(たぶん)

watosarwatosar

無名関数(匿名関数)の定義方法

  1. 標準的
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
  1. 標準的でない方法
(a,b;c,d) where{}= (a,b,c,d)

begin
    a
    c
end where{} = (a,c)

()(a,b;c,d) = (a,b,c,d)
watosarwatosar

()への代入操作は無視される

> () = 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
))))