#Julia言語#Lisp のマクロは難しいです。

そういう難しいものについては、

* プログラミングの専門家以外は使えなくてもよい

という考え方もありだと思う。しかし、

* 必ずしもそうとは言えない場合もある

と私は考えています。例えば、特殊函数の専門家の数学者が~続く
#Julia言語 例えば、特殊函数論が専門の数学者が自分が愛している有用な特殊函数の数値計算ライブラリを作って配布したいと思ったとします。

特殊函数の数値計算は多項式や有理函数による近似に帰着する場合が多く、「係数をべた書きしたホーナー法」で書くと計算が効率的になります。続く
#Julia言語 続き。しかし、そのようなコードを数学者に直接書かせることは効率的ではありません。

数学者が知っている係数の計算法に従って係数が自動的に計算され、それが「係数をべた書きしたホーナー法」のコードに自動変換される仕組みが好ましいです。

まさにそれをやるのがマクロです!
#Julia言語 そのような実例が、繰り返し紹介している「MITでの宿題の答え」

nbviewer.jupyter.org/github/steveng…

にあります。現在のJuliaでも動くようにしたものが

nbviewer.jupyter.org/gist/genkuroki…

にあります(添付画像)。しかし、Exprの直書きなどが使ってあって、普通の数学者はコードの解読さえ困難でしょう。
#Julia言語 「特殊函数論の数学」と「JuliaやLispのような完全なマクロ」の両方を知っていれば、それらはほぼ無関係な数学的事柄であることもすぐに理解できると思います。

前者の専門家に後者を気軽に利用できる道が開かれれば、今まで表に出難かった成果が自然に出て来るものと思われます。
#Julia言語 以上においては私が責任を持てそうな「特殊函数論」を例に使いましたが、あらゆる数学および科学および技術に関しても同じような話があると思います。

徹底的に効率的な計算の世界への道が素人にも開かれるようになるのは非常に良いことだと思います。
#Julia言語 Juliaのコードの多くは、特別にJuliaの知識がなくても、概ねこんなことをやっているのだろうと推測できる程度には易しいのですが、Exprを直書きするタイプのマクロを使われてしまうと、Juliaであっても全然そうではなくなります。

この問題を解決する天才が現れることを期待。
#Julia言語 でのマクロについて理解したい人は以下のリンク先のスレッドを見て下さい。

ついさっき公開した野良パッケージ

github.com/genkuroki/Meta…

で遊ぶと、理解がはかどるかも。
#Julia言語 野良パッケージ github.com/genkuroki/Meta… の応用例

gist.github.com/genkuroki/e943…

添付画像

1. Meta.@ dumpの表示は詳細だが見難い。

2. 上の野良パッケージを使えばよりコンパクトな表示が可能である。

3. 上の野良パッケージを使えばLisp風のタプルで書かれた式を実行可能!
#Julia言語 メモ

LineNumberNodeの例

マクロの式をExprで書こうとすると、LineNumberNodeを入れないといけない。(Julia v0.5とかv0.6時代は確かそうではなかった)

後で野良パッケージを改良しておこう。
#Julia言語 野良パッケージ

github.com/genkuroki/Meta…

のLineNumberNodeの表示を変えた。

gist.github.com/genkuroki/e943…

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with 黒木玄 Gen Kuroki

黒木玄 Gen Kuroki Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @genkuroki

9 Oct
#Julia言語 【ネタ】tuple processing language

S式っぽいタプルでJuliaの式を与えると、それを解釈して実行してくれるマクロ(笑)

空行とコメントを合わせても33行しかありません。続く

gist.github.com/genkuroki/b410…
#Julia言語 タプル式でsin(π/6)を計算してみましょう。

(:call, :sin, (:call, :/, π, 6))

を実行すれば sin(π/6) を計算できます。:call を省略して

(:sin, (:/, π, 6))

でも同じ結果が得られるようにしてあります。続く
#Julia言語 タプル式で函数も定義できます。

(:(=), (:call, :f, :x), (:call, :sin, :x))

で f(x) = sin(x) と定義できます。In[4]ではそのようにして定義した f(x) を使って f(π/6) を計算しています。続く
Read 8 tweets
9 Oct
#Julia言語 リンク先のリンク先のブログ記事に言及している人が多い!私が書いたんじゃないけど、なんかうれしい。

細かいケアレスミスがあってもそういうのは本質ではなくて、おもろいネタで長文を書きまくっていて楽しそうな点が秀逸!

JuliaとLispのマクロの話がウケるというのもすごい話!
#Julia言語 Juliaのマクロを理解するために役に立つ情報(ネタ)

S式風のタプル式

(:call, :sin, (:call, ;/, π, 6))

をJuliaの式

Expr(:call, :sin, Expr(:call, ;/, π, 6))

に変換して実行するマクロ。これは :(sin(π/6)) に等しい。

この辺の知識があるとJuliaのマクロを理解し易くなる。
Read 39 tweets
9 Oct
#Julia言語 「最初のプロットの遅延問題」は有名な欠点で、nightly buildで大きな改善されています。

遅いのは「最初のプロット」だけなので、プロット用のコードを書いたfoo.jlについて毎回

julia foo.jl

としていなければ大した問題にはならないです。

juliaは再起動の回数を減らして使いたい。
#Julia言語 REPL、Jupyter、Juno、VSCode内でJuliaを使い、コードを書き始める前に、

using Plots
plot(sin)

を実行しておいて、その後にプロット用のコードを書いて実行すれば実質的に待ち時間はゼロ。
#Julia言語 公式ドキュメントの

docs.julialang.org/en/v1/manual/w…

の方法:Jupyter

github.com/JuliaLang/IJul…

を使ったり、Revise.jl

github.com/timholy/Revise…

を使って、

julia> using Revise
julia> includet("foo.jl")
julia> plot_foo()
失敗→foo.jlを編集→編集結果が自動反映
julia> plot_foo()
Read 4 tweets
9 Oct
#Julia言語 nightly build で、パッケージA.jlの中のXをYという名前で使いたい場合に

using A: X as Y

とできるようになっていますね。

github.com/JuliaLang/juli…

添付画像はすでにIを使ってしまっているので、

using LinearAlgebra: I as E

としている場合。

gist.github.com/genkuroki/d812…
#Julia言語 個人的には

import LinearAlgebra as linalg

として

A = randn(100, 100)
fac = linalg. lu(A)
e = linalg. eigen(A)

のように、「わざわざ」もしくは「必然性不明の短縮」で至る所 linalg. を付けて書くようなスタイルを使う人が

増えないで欲しいな

と思います。
#Julia言語 Pythonという特殊で一般性に欠けた世界の1つで普通になっている方法で import as を使う人が増えるのは、私も不快。

このスレのトップで紹介したように「すでにIを使っているので、LinearAlgebra.jlのIをEという名で使うため」に、

using LinearAlgebra: I as E

とできるのは便利。
Read 5 tweets
9 Oct
#統計

標本のばらつきの指標として
分散を採用する必然性は__ない__。
中央値との差の絶対値の加法平均も
立派なばらつきの指標である

という話は繰り返ししている。
しかも、Laplace分布モデルとの関係まで言及している。

繰り返し言及していることの証拠↓
twilog.org/genkuroki/sear…
#統計

標本平均と標本分散の計算
=正規分布モデルによる最尤推定

標本の中央値との中央値との差の絶対値の平均の計算
=Laplace分布モデルによる最尤推定

こういう関係。

「標本の代表値としてどれを重用するか」と
「どのような統計モデルで推定するか」の間には
上のような関係がある。
#統計 モデルが現実に合ってなければ捨てられるのはモデルの側なのに、実質正規分布モデルによる推定になっている「代表値としての分散の採用」にまるで必然性があるかのような説明をしようとしている場合が結構あるように見える。

大学の先生でもこの点はかなりひどいのでは?
Read 14 tweets
9 Oct
Re: RT #数楽

Bernoulli多項式を「特殊値」として持つゼータ函数はHurwitzのゼータ函数である。(その特別な場合がRiemannのゼータ函数)

問題:それと同様の意味でHermiteの多項式を「特殊値」として持つゼータ函数に類似はあるか?

答え:ある‼️↓
nbviewer.jupyter.org/github/genkuro…
#数楽 区間[0,1]上の一様分布の分配函数(=モーメント母函数)の

Z(β) = ∫_0^1 e^{-βx} dx = (e^{-β} - 1)/(-β)

の逆数とベルヌイ数の母函数は本質的に一致し、統計力学の意味での[0,1]上のカノニカル分布

e^{-βx}/Z(β) = (-β)e^{-βx}/(e^{-β} - 1)

はベルヌイ多項式の母函数に本質的に一致する。
#数楽 Hurwitzのゼータ函数は[0,1]上の一様分布のカノニカル分布のMellin変換に本質的に一致する。

これを、ℝ上の(適当な条件を満たす)任意の確率分布のカノニカル分布のMellin変換に一般化すれば、一般化されたHurwitzのゼータ函数が定義される。
Read 6 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!