Julia Juno Jupyter part1 [無断転載禁止]©2ch.net
実は数年前にここでjuliaスレ立てたんだが落ちたんだよなあ。。。。 漏れもなんとなく見覚えがある気がするんだよなぁ・・・
落ちる条件ってなんだっけ という訳で保守がてら
juliaからCの関数を呼んでみた
julia> ccall(:printf, Void, (Ptr{Cchar}, Ptr{Cchar}), "%s", "abc")
abc
julia> ccall(:printf, Void, (Ptr{Cchar}, Ptr{Cchar}, Int), "%s%d", "abc", 9)
abc9
引数の数が自由なのがいいねっ! おれおれDLLだと呼び出し方がちょっと変わるみたい
(最近仕様が変わったらしいので古いドキュソの通りやると動かない
っていうか最新のドキュソもまだ動かないサンプルのままだぞω)
julia> libcurl = Base.Libdl.dlopen_e("./libcurl.dll")
Ptr{Void} @0x2c76e2c0
julia> curl_version = Base.Libdl.dlsym(libcurl, :curl_version)
Ptr{Void} @0x6b25c740
julia> curl_getenv = Base.Libdl.dlsym(libcurl, :curl_getenv)
Ptr{Void} @0x6b25c854
julia> curl_free = Base.Libdl.dlsym(libcurl, :curl_free)
Ptr{Void} @0x6b25cbf8
julia> p = ccall(curl_version, Ptr{Cchar}, ())
Ptr{Int8} @0x6b29c060
julia> ccall(:printf, Void, (Ptr{Cchar}, Ptr{Cchar}), "%s", p)
libcurl/7.30.0 OpenSSL/1.0.1e zlib/1.2.7
julia> q = ccall(curl_getenv, Ptr{Cchar}, (Ptr{Cchar}, ), "NUMBER_OF_PROCESSORS")
Ptr{Int8} @0x2c76df10
julia> ccall(:printf, Void, (Ptr{Cchar}, Ptr{Cchar}), "%s", q)
8
julia> ccall(curl_free, Cuint, (Ptr{Void}, ), q)
0x00000001
julia> Base.Libdl.dlclose(libcurl)
うっかり解放忘れそう stdcallな関数だとさらにこんな感じだよ
julia> user32 = Base.Libdl.dlopen_e("user32.dll")
Ptr{Void} @0x2c767300
julia> MessageBoxA = Base.Libdl.dlsym(user32, :MessageBoxA)
Ptr{Void} @0x76c6cf50
julia> err = ccall(MessageBoxA, stdcall, UInt, (Ptr{UInt}, Ptr{Cchar}, Ptr{Cchar}, UInt), 0, "Hello, work!", "Message", 0)
0x00000001
wchar_tはArray{UInt16,1}らしい(UTF8を表示したければ先にwchar_tへの変換が必要)
julia> MessageBoxW = Base.Libdl.dlsym(user32, :MessageBoxW)
Ptr{Void} @0x76c6d280
julia> err = ccall(MessageBoxW, stdcall, UInt, (Ptr{UInt}, Ptr{Cwchar_t}, Ptr{Cwchar_t}, UInt), 0, Array{UInt16,1}([0x304C,0x3063,0xFF01,0]), Array{UInt16,1}([0x306C,0x308B,0x307D,0]), 0)
0x00000001
julia> Base.Libdl.dlclose(user32)
解放解放
引数や戻り値の定義を呼び出しのたびに何度も書くの面倒なのでマクロを書くのが良いらしいよ >っていうか最新のドキュソもまだ動かないサンプルのままだぞω
ああごめん動くわ ccall(:printf, Void, (Ptr{Cchar}, Ptr{Cchar}), "%s", ccall((:curl_version, :libcurl), Ptr{Cchar}, ()))
err = ccall((:MessageBoxW, :user32), stdcall, UInt, (Ptr{UInt}, Ptr{Cwchar_t}, Ptr{Cwchar_t}, UInt), 0, Array{UInt16,1}([0x304C,0x3063,0xFF01,0]), Array{UInt16,1}([0x306C,0x308B,0x307D,0]), 0)
Array{UInt16,1}のところはArray{Cwchar_t}とかVector{Cwchar_t}とも書ける
err = ccall((:MessageBoxW, :user32), stdcall, UInt, (Ptr{UInt}, Ptr{Cwchar_t}, Ptr{Cwchar_t}, UInt), 0, Vector{Cwchar_t}([0x304C,0x3063,0xFF01,0]), Array{Cwchar_t}([0x306C,0x308B,0x307D,0]), 0)
これでいいね
loadは省けるけど毎回loadと解放してくれてるんだろうか もう少しちらうら
julia> bytes2hex([65,97,66,98,0x5c])
ERROR: MethodError: `bytes2hex` has no method matching bytes2hex(::Array{Int32,1})
julia> bytes2hex(Array{UInt8,1}([65,97,66,98,0x5c]))
"416142625c"
julia> bytestring(Array{UInt8,1}([65,97,66,98,0x5c]))
"AaBb\\"
julia> hex2bytes("416142625c")
5-element Array{UInt8,1}: 0x41 0x61 0x42 0x62 0x5c
julia> string2bytes("AaBb\\")
ERROR: UndefVarError: string2bytes not defined
julia> stringbytes("AaBb\\")
ERROR: UndefVarError: stringbytes not defined
julia> read(IOBuffer("AaBb\\"))
ERROR: MethodError: `read` has no method matching read(::Base.AbstractIOBuffer{Array{UInt8,1}})
julia> read(IOBuffer("AaBb\\"), UInt8)
0x41
julia> read(IOBuffer("AaBb\\"), UInt8, length("AaBb\\"))
5-element Array{UInt8,1}: 0x41 0x61 0x42 0x62 0x5c
んー
マニュアルにはreaddim()があるって書いてあるのに・・・
何かimport忘れてるとか?
length省略できんのもなんだかな
勘違いならいいけど ちょっと前から同名のAV女優が出てきて検索がちょっとアレになったよね
運が悪い "どうすればPythonをJuliaと同じくらい速く動かせるのか? : 様々なやり方で計算の高速化を図る"
http://postd.cc/python_meets_julia_micro_performance/ パッケージがおれおれやってみたばっかりで
まともなものが少ねーじゃねーか
これ PyPI よりひでーぞ
github っつーかオプソは害だな >>16
21世紀にもなって添え字が 1 から始まるとかもうね おまいらなんだかんだ言って
みんなそれなりにやってんだな
ニヤニヤ >1 乙
>14 前スレで見た覚えがある
>16 それな コンパイル中のエラーよりも実行時の型エラーの方が厄介な言語だなこいつは。
慣れれば問題ないが。 >>13
非推奨っぽいが、
これでいいらしい。
"AaBb\\".data
代入も出来るようだ。
s = "AaBb\\"
s.data[2] = UInt8(64)
s これは割りと嬉しいかも。
julia> @sprintf "ab [%7s]" "xあx"
"ab [ xあx]"
julia> @sprintf "ab [%-7s]" "xあx"
"ab [xあx ]"
julia> @sprintf "ab [%7s]" "xxx"
"ab [ xxx]"
julia> @sprintf "ab [%-7s]" "xxx"
"ab [xxx ]" うむむ
julia> @sprintf "ab [%-7s]" bytestring(hex2bytes(""))
"ab [ ]"
julia> @sprintf "ab [%-7s]" bytestring(hex2bytes("4141E381824141"))
"ab [AAあAA ]"
julia> @sprintf "ab [%-7s]" bytestring(hex2bytes("4141E981824141"))
"ab [AA遂AA ]"
julia> @sprintf "ab [%-7s]" bytestring(hex2bytes("4141Ee81824141"))
"ab [AA\ue042AA ]"
julia> @sprintf "ab [%-7s]" bytestring(hex2bytes("4141Ef81824141"))
"ab [AA\uf042AA ]"
julia> @sprintf "ab [%-7s]" bytestring(hex2bytes("4141E881824141"))
"ab [AA聂AA ]"
julia> @sprintf "ab [%-7s]" bytestring(hex2bytes("4141E8e8824141"))
"ab [AA騂AA ]"
julia> @sprintf "ab [%-7s]" bytestring(hex2bytes("4141E9e8824141"))
"ab [AAꨂAA ]"
julia> @sprintf "ab [%-7s]" bytestring(hex2bytes("414155aa554141"))
ERROR: UnicodeError: invalid character index
in next at unicode/utf8.jl:65
in strwidth at strings/basic.jl:205
[inlined code] from printf.jl:159
in anonymous at no file:0
julia> @sprintf "ab [%-7s]" hex2bytes("414155aa554141")
"ab [UInt8[0x41,0x41,0x55,0xaa,0x55,0x41,0x41]]" >>11
julia> ccall((:curl_version, :libcurl), Ptr{Cchar}, ())
Ptr{Int8} @0x6b29c060
julia> @sprintf "%s" ccall((:curl_version, :libcurl), Ptr{Cchar}, ())
"Ptr{Int8} @0x6b29c060"
んーこれも期待した動作と違うなぁ。 >>16
ifに括弧なしは一見便利だけどend強制されるのはPythonに慣れてるとうざく感じる。
julia> Array{UInt8}([1:n;]) == map(a -> UInt8(a), 1:n)
true
ちょっと気持ち悪いところもある。 julia> Array{UInt8}([1:n;]) == map(a -> UInt8(a), (1:n))
true
julia> Array{UInt8}([1:n]) == map(a -> UInt8(a), (1:n))
警告出るが
true
(二回目からは警告出なくなる?)
julia> Array{UInt8}((1:n)) == map(a -> UInt8(a), (1:n))
エラー >>25
bytestring(ccall((:curl_version, :libcurl), Ptr{Cchar}, ())) >>28
有賀d。
>>24でも書いたけどbytestringってこんなデータ来ると死ぬから使いたくないなぁ。
julia> bytestring(hex2bytes("414155aa554141")) julia> pointer_to_array(ccall((:curl_version, :libcurl), Ptr{Cchar}, ()), n)
でnバイト分のArray{Int8}になるみたいだけどなぜかデフォでUInt8じゃないのが気に入らないなぁ。
julia> Array{UInt8}(pointer_to_array(ccall((:curl_version, :libcurl), Ptr{Cchar}, ()), n))
とかいちいち書くの面倒だなぁ。 >>30
Cchar == UInt8 # false
Cchar == Int8 # true >>31
julia> pointer_to_array(ccall((:curl_version, :libcurl), Ptr{UInt8}, ()), n)
できました!!
ありがとうございます!!! 今はまだ julia 0.3.2 対応みたいだけど web から試せるよ
https://try.jupyter.org/
IJulia をインストールすれば自分のサイトでもできるよ
https://github.com/JuliaLang/IJulia.jl >>14
ちょっと前から声が大きいだけで連投するうざいのが住み着いて2ちゃんはちょっとアレになったよね
筋が悪い 英語だが Julia をつかった科学計算を丁寧に解説しているサイト
ちなみに著者の一人 Sargent はノーベル経済学賞をとっている
http://quant-econ.net/jl/ exe 化してみたら dll いっぱい作られて 200MB 超えるな
exe なのにロードして実行されるまで時間かかりすぎる
普通に julia --precompiled=yes hoge.jl で実行する方が速かった
python の exe 化と大して変わらん 想像以上にアホの子かもな
julia> "あいう"[end:end]
"う"
julia> "あいう"[end-1:end]
ERROR: UnicodeError: invalid character index
julia> "あいう"[end-3:end]
"いう"
julia> "あいう"[1:end]
"あいう"
julia> "あいう"[2:end]
ERROR: UnicodeError: invalid character index
julia> "あいう"[2]
ERROR: UnicodeError: invalid character index
julia> "あいう"[3]
ERROR: UnicodeError: invalid character index
julia> "あいう"[4]
'い'
julia> length("あいう")
3
julia> length("1いう")
3
julia> ("1いう")[2]
'い'
julia> ("1いう")[end]
'う'
julia> ("1いう")[3]
ERROR: UnicodeError: invalid character index >>42
# 文字列は文字の配列のように添字アクセスできます
"This is a string"[1] # => 'T' # Julia では添字は 1 から始まります
# ただし、UTF8 文字列の場合は添字アクセスではうまくいかないので、
# イテレーションを行ってください(map 関数や for ループなど) Pythonの実行速度に満足できないあなたに
http://www.mwsoft.jp/programming/julia/python_to_julia.html
正直なところ、まだ足りないところも多い言語なので、
今の時点で飛び込んでもそんなに良いことはないかもしれません。
個人的には分析するデータの整形をさせたり、簡単なシュミレータを書き捨てる用途などで使っています。
適当に書いてもそれなりに速度が出るし記法もシンプルで書きやすいので、
Pythonよりも便利だと感じていますが、
ライブラリの揃いや信頼性などの問題で、前処理だけはJuliaでやって
肝心なところはPythonやRで、といった流れになることもしばしばです。 Pythonの実行速度に満足できないあなたに
http://www.mwsoft.jp/programming/julia/python_to_julia.html
これからJuliaを始める方へ
これからJuliaを始めようという方は、まずは下記ページに書かれているサンプルコードを眺めてみると、
どんな言語か理解できると思います。
Julia By Example
http://www.scolvin.com/juliabyexample/
統計関連のライブラリがどの程度揃っているかは、下記にまとめられています。
ちゃんとDataFrame的なものもあって、そこそこ揃ってはいます。
Julia Statistics
https://github.com/JuliaStats
入門書などの情報は出版されれば下記に掲載されると思う。(まだ入門書なんて存在しねーけどな)
Learning Julia
http://julialang.org/learning/
公式サイトのドキュメントも充実しています。充実し過ぎてどこから読めばいいのかわからなくなります。
Julia Documentation
http://docs.julialang.org/
あとは挙動でわからないことがあれば、ソースを読もう。
わかりやすいシンプルなコードなので、意外と簡単に読めます。
言語作者が書いたコードに触れておくと勉強になるしね。
JuliaLang/julia - GitHub
https://github.com/JuliaLang/julia
本当はもっと初見向きなサイトを紹介したかったんだけど、あまり見当たらない。
今の調子ならそのうち増えてくると思うので、
その手の本を書店で見かけるようになった時が始めるタイミングとしては良いんじゃないだろうか。
※本項は更新情報があれば適宜変更します julia> run(`cmd /c dir`)
したときは日本語が UTF-8 に変換されてるのかな
julia> open(`cmd /c dir`) do f
for l in eachline(f)
println(chomp(l))
end
end
すると結果が違うような気がするけど気のせいかな
julia> open("test_out.txt", "w") do w
open(`cmd /c dir`) do r
for l in eachline(r)
println(w, chomp(l)) # これだとSJISで書き込まれているな
end
end
end julia> (3+2im)*(3-2im)
13 + 0im
julia> 1//3 + 1//3 + 1//3
1//1
julia> 2π
6.283185307179586
julia> r = 4
4
julia> 2πr
ERROR: UndefVarError: πr not defined
julia> 2π*r
25.132741228718345
実におしい >>11
ccall((:MessageBoxW, :user32), stdcall, UInt, (Ptr{Void}, Ptr{Cwchar_t}, Ptr{Cwchar_t}, UInt),
C_NULL, [0x304C,0x3063,0xFF01,0x0000], [0x306C,0x308B,0x307D,0x0000], 0)
この方が良くね? ccall((:MessageBoxW, :user32), stdcall, UInt, (Ptr{Void}, Ptr{Cwchar_t}, Ptr{Cwchar_t}, UInt),
C_NULL, pointer("がっ!"), pointer("ぬるぽ"), 0)
これだと化けるから、
ccall((:MessageBoxA, :user32), stdcall, UInt, (Ptr{Void}, Ptr{Cchar}, Ptr{Cchar}, UInt),
C_NULL, pointer("がっ!"), pointer("ぬるぽ"), 0)
にしたんだがやっぱり化ける。
原因はわかるんだが、wchar_t の文字列は作れない子なの? >>41
こういうことらしい。
julia> "ぬるぽ"[nextind("ぬるぽ", 0):end]
"ぬるぽ"
julia> "ぬるぽ"[nextind("ぬるぽ", 1):end]
"るぽ"
julia> "ぬるぽ"[nextind("ぬるぽ", 2):end]
"るぽ"
julia> "ぬるぽ"[nextind("ぬるぽ", 3):end]
"るぽ"
julia> "ぬるぽ"[nextind("ぬるぽ", 4):end]
"ぽ"
julia> "ぬるぽ"[nextind("ぬるぽ", 5):end]
"ぽ"
julia> "ぬるぽ"[nextind("ぬるぽ", 6):end]
"ぽ"
julia> "ぬるぽ"[nextind("ぬるぽ", 7):end]
""
julia> "ぬるぽ"[nextind("ぬるぽ", end-1):end]
"ぽ" "るぽ"をendの差分で取るのはループしないかぎりむりぽか >>49-50
julia> ccall((:MessageBoxW, :user32), stdcall, UInt, (Ptr{Void}, Ptr{Cwchar_t}, Ptr{Cwchar_t}, UInt),
C_NULL, pointer(utf16("がっ!")), pointer(utf16("ぬるぽ")), 0)
julia> ccall((:MessageBoxW, :user32), stdcall, UInt, (Ptr{Void}, Ptr{Cwchar_t}, Ptr{Cwchar_t}, UInt),
C_NULL, pointer(wstring("がっ!")), pointer(wstring("ぬるぽ")), 0)
>>42-43 >>51-52
julia> utf16("ぬるぽ")[end-1:end]
"るぽ"
julia> wstring("ぬるぽ")[end-1:end]
"るぽ"
どうしても UTF-8 のままが良いなら
julia> s[prevind(s, end):end]
"るぽ"
http://docs.julialang.org/en/release-0.4/stdlib/strings/
読め
結論
>>42 がアホ 地雷満載
julia> length(utf16("あいう"))
3
julia> sizeof(utf16("あいう"))
6
julia> endof(utf16("あいう"))
3
julia> sizeof(utf16("あいう").data)
8
julia> endof(utf16("あいう").data)
4 PythonよりUnicodeの扱いが親切だと思うω if __name__ == "__main__": みたいなのは無いんかな open(hoge) do f
fuga(f)
end
みたいな do end 出来る関数ってどうやって作るんですか? julia> ASCIIString <: AbstractString
true
julia> Array{ASCIIString, 1} <: Array{AbstractString, 1}
false
julia> Array{ASCIIString, 1} <: Array{Union{ASCIIString, UTF8String}, 1}
false
julia> Array{Union{ASCIIString, UTF8String}, 1} <: Array{AbstractString, 1}
false
julia> typeof(["abc"]) <: Array{ASCIIString, 1}
true
julia> typeof(["abc"]) <: Array{AbstractString, 1}
false
julia> typeof(["abc"]) <: Array{Union{ASCIIString, UTF8String}, 1}
false
これなんとかならんか? 「XXX を削除できません。
ほかの人またはプログラムによって使用されています。
ファイルを使用している可能性があるプログラムをすべて閉じてから、やり直してください。」
が出る場合、そのファイルを使用しているプロセスを知る方法はありますでしょうか
あるよ
ただ、簡単ならいくらMicrosoftが能無しでもそこのダイアログに誰が開いているか表示するだろう
そのくらい面倒くさくまともな方法じゃないってことは察しろ >>61
言いたいことは分かるけど
継承関係にないジェネリッククラスに継承関係を認めたら
それはそれで問題が起きるから
特に配列の場合はパフォーマンスが犠牲になるので受け入れがたいし
C++とかだとバグの温床なので「できて当然」という考えは捨てた方がいい 匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています
言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?
Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al
ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw
The Covenant Project
概要
Covenantは、純粋P2Pのファイル共有ソフトです
目的
インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します
特徴
Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)
接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
6 まともな開発者が使うなら何でもいいんだよ
juliaユーザーは一概にレベルが低いから信頼性の低いライブラリと化学反応を起こして爆発するのだ
ただしnodeよりマシか 初心者に Fortran 教えるくらいなら Julia の方がマシ Jupyter Notebookで説明書きの通りのコードを入れても動きません。
terminals are unavailable と表示されてるのですが、これが動かない理由でしょうか。 C資産との連携を強調してるけど
JuliaでC呼ぶのは苦痛でしかない
Cで書いた方がまし 相変わらずだな
514 デフォルトの名無しさん sage 2016/07/04(月) 01:22:47.14 a5Gl8mUE
Juliaの開発、俺が引き受けるから科研費くれ
という主張をしてみるか悩んでる
515 デフォルトの名無しさん sage 2016/07/04(月) 01:35:22.05 WZmggq2i
Julia で検索したら、AV 動画見たばかりでワロタ w
516 デフォルトの名無しさん sage 2016/07/04(月) 01:36:38.53 WZmggq2i
ありゃ、
AV 動画ばかりって書きたかったの…
517 デフォルトの名無しさん sage 2016/07/04(月) 01:44:34.13 Jqw/8rJ7
私も今まさにそれ思ってた>AVばっかり Juliaってデータ分析というより数値計算じゃないの
全部インメモリの固定長配列にブチ込んでループぶん回す昔ながらのやつだよね 別にデータ分析以外の数値計算が出来ないと言っている訳じゃないし
昔ながらのやつを現代的に書けるというだけでも有意義だろう なんで >>83 へのレスが >>84 みたいなことになるんだろ
文盲かな? なんで >>84 へのレスが >>85 みたいなことになるんだろ
文盲かな? 誤解されてるようなので
>実際コード書いてても Python や C++ と比べて julia のコードって汚いんだよな
特定の条件がそろったときだけど
綺麗に描けることもある 誤爆か
言語内DSLを別言語とみなすなら
C++で綺麗に書けるものがjuliaで書くと汚いってことは考えにくいんだが?
C++は数値を表す抽象型が標準にないのが致命的
そのくせ最近までサイズ固定の整数型がなかった
pythonについてはラムダ式が好きになれない(汚いとは別だが)
まぁjuliaに求めるものは綺麗さじゃなく実用性なんだ
おっぱい的な意味で やっと気付いた
漏れはきっと end が嫌いなんだ julia> reinterpret(Bool, 1)
true
julia> reinterpret(Bool, 2)
false
julia> reinterpret(Bool, 3)
true
julia> reinterpret(Bool, 4)
false
julia> reinterpret(Bool, 0)
false
julia> reinterpret(Bool, -1)
true
julia> reinterpret(Bool, -2)
false
ワロス 笑いどころがわからない
配列用でないreinterpretはconvertと違って慎重に使うべきもの
julia> reinterpret(Bool, 256)
false
これは気持ち悪い
……と開発者も思ったらしくv0.5ではエラーになる見込み 間にscheme入ってるならpythonに近い文法に変換するのも簡単に出来るのでは? pythonに近い文法を求めているならpython使えばいいんでは?
てかschemeに何の関係が? >>7-11 >>25 >>28 >>30-32
定義はmacro使うと楽
macro c(restype, fnc, argtypes)
local args = [symbol("a", n) for n in 1:length(argtypes.args)]
quote
$(esc(fnc))($(args...)) = ccall($(string(fnc)), $restype, $argtypes, $(args...))
end
end
@c UInt32 printf (Ptr{Cchar},)
@c UInt32 printf (Ptr{Cchar}, UInt32,)
printf(pointer(Array{UInt8,1}([65,66,0,67,68,0,0])))
printf("%s\n", pointer(Array{UInt8,1}([65,66,0,67,68,0,0])))
macro m(lib, restype, fnc, argtypes)
local args = [symbol("a", n) for n in 1:length(argtypes.args)]
quote
$(esc(fnc))($(args...)) = ccall(($(string(fnc)), $(Expr(:quote, lib))), $restype, $argtypes, $(args...))
end
end
@m libcurl Cint curl_free (Ptr{Void},)
@m libcurl Ptr{Cchar} curl_getenv (Ptr{Cchar},)
@m libcurl Ptr{Cchar} curl_version ()
v = curl_getenv("TZ")
printf(v)
curl_free(v)
printf(curl_version()) >>9
macro w(lib, restype, fnc, argtypes)
local args = [symbol("a", n) for n in 1:length(argtypes.args)]
quote
$(esc(fnc))($(args...)) = ccall(($(string(fnc)), $(Expr(:quote, lib))), stdcall, $restype, $argtypes, $(args...))
end
end
@w user32 UInt32 MessageBoxA (UInt32, Ptr{Cchar}, Ptr{Cchar}, UInt32,)
MessageBoxA(C_NULL, "hage", "title", 1) >>97-98
32bit 限定のコードを書くべきじゃないな 呼び出すライブラリの仕様は確定しているのだから実用上問題ないのでは?