kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

スマホからbr

パラグラフにしないただの改行ってどうやって入れればいいのかなって
思ってたんですよね
brタグってやつですね
どうもこのスタイルじゃないと書けなくて

PCから入れるときはShift+Enterでできるんですけど
スマホからだと入らないみたいです
もともと入れられるようになってないのかも

で、ちょっと試してたんですが
どうやらMarkdownのモードにして行末に2個の空白で行けるみたいです
PCから見てみないとちょっと不安ですが
うまくいってればスマホから書くときの障害がひとつ減ったということで

あとは行の幅の感覚かな
これはほかの記事と見くらべればいいし
よしこれであとはPCから確認だ

達成!

RacketのMacroを調べてみる (10)

普通の関数でエラーに対応するには、エラーをチェックするコードを入れる以外に
契約を用いたり、Typed (型付き) Racketを使うという手段があります

マクロではこれまでfenderを入れたり、エラーチェックして
raise-syntax-errorを呼んだりしてましたが
契約や型に相当するチェック方法があるとのこと

それがsyntax-parse
型に相当する、syntax classを使ってエラーチェックができるとのこと

ではいよいよsyntax-parseの詳細です

以上
まじすか

ここまでちゃんと理解してきたら上のドキュメントが読みこなせるはずだ、と
いうことらしいです
ということでここから「Syntax: Meta-Programming Helpers」読んでいく
話になります
長いからSMPHくらいの呼び名がいいかな

アートコミック まんが西洋美術史 1〜3

この間ちらっと書いた「まんが西洋美術史」って本なんですけど
思った以上によかったです
娘もしっかり読んでます

3冊1000円以下で買えたことを考えると超お買い得
定価で買ってても後悔はなかったと思います

思った以上に解説がかなりしっかりました 分量も多いし
ほんとにしっかりしてるかは美術に詳しいわけじゃないんでわからないんですけど
なんとなく気合を感じます
総ルビですが大人でも読める文章 
マンガ部分は絵がウリになるほどではないですけど落ち着いて読めます
1巻の最初の方の絵は好きなんですが残念ながらそこだけ

ざっとひととおり読んだだけなんでこれからもぼちぼち読んでみようと思います
日本美術史の方も買おうかなあ
ブックオフに残ってるといいけど

あと、同じ出版社から「マンガ西洋美術史」ってのが出てます
こっちは2014年刊行で「まんが西洋美術史」は1994年刊行
20年経ったし新しいの作るか―みたいな感じなんですかね
取り上げてる時代も画家も監修も違ってるみたいなんで内容はかなり違うかも
Amazonで表紙見ただけですが絵柄は今どきっぽい雰囲気です
中身はわかりませんけど
でもちょっと興味あり

こんな感じでまんが科学史とかまんが数学史とか出してください>出版社さん

原始・古代…ルネサンス美術 (まんが西洋美術史)

原始・古代…ルネサンス美術 (まんが西洋美術史)

 
バロック…印象主義の美術 (アートコミックまんが西洋美術史)

バロック…印象主義の美術 (アートコミックまんが西洋美術史)

 
後期印象主義 20世紀の美術 (アートコミック まんが西洋美術史)

後期印象主義 20世紀の美術 (アートコミック まんが西洋美術史)

 

 

闇は近い?

今日はヨメがママ友といっしょだったんですけどね
ママ友のダンナの職場は休みが月4日しかないらしいんですよ
で「有給とかどうなってんの?」って聞いたら
「有給?なにそれ?」って普通に聞き返されたらしくてびっくり
営業時間が11時間くらいあるんだけど全員普通に開店前から
閉店後までいるとか
シフトというものも存在しないらしいし

病気で休んだこともないっていうけどそれって健康だからなの?

それでもダンナの方がその仕事が好きで、1日やってても楽しいとかなら
いいのかなと思ったんだけど
疲れ切ってて転職したいって言ってるとか

ママ友さんのほうもちょっとのん気系なのかなんなのかよくわかりませんが
ヨメがけっこう教育したみたい

別の人だけど「ウチのダンナ、38度出たくらいで会社休むのよ」って
言ってるのを聞いていやそれは休ませてあげてよとか思ったこともありました

ウチはヨメも自分も普通に有給が取れる環境で働いてきたせいもあって
あんまり意識してなかったけど
けっこう世の中そんなもんだったりするんですかね

RacketのMacroを調べてみる (9)

今回はanaphoric ifの話から

> (aif (big-long-calculation)
       (foo it)
       #f)

って書くと、(big-long-calculation)#fのときは当然#fを返しますが
そうでないときは(big-long-calculation)の結果をitが覚えててくれる、というもの
普通はletでいったん変数に入れておくなどしますがその手間が省けると

で、なにも考えずにこう書くと

(define-syntax-rule (aif condition true-expr false-expr)
  (let ([it condition])
    (if it true-expr false-expr)))

define-syntax-ruleの中のitと、(foo it)it
別物としてあつかわれてしまい、想定した動きになりません

ここでSyntax Parameterの登場です

そもそもRacketにはParameterってやつがありまして
ものすごくざっくりいうと、少しお行儀のいいグローバル変数くらいのものです
ちょっと一時的に値を変更したりすることが安全にできます
でSyntax ParameterっていうのはそのSyntax版

ではaifの定義を見ていってみます

(require racket/stxparam)

Syntax Parameter関連はstxparamモジュールに入っているのでrequireします

(define-syntax-parameter it
  (lambda (stx)
    (raise-syntax-error (syntax-e stx) "can only be used inside aif")))

itという名前のSyntax Parameterを定義します
なにもなしで使うとエラーを出すようにしています

(define-syntax-rule (aif condition true-expr false-expr)
  (let ([tmp condition])

いったん計算してletでいったんtmpという変数に入れます

    (if tmp
        (syntax-parameterize ([it (make-rename-transformer #'tmp)])
                             true-expr)
        false-expr)))

make-rename-transformerは、他の識別子名を読み替えてしまうtransformerを作ります
syntax-parameterizeは一時的にSyntax Parameterの値を変更します
スコープを抜けると自動的に元の値に戻ります

というわけで、true-exprを評価している間だけ
itという識別子がtmpに読み替えられます

というわけでaifのできあがり

次は splicing-let の話です

Scheme修行にはこんな書き方が出てきてました
yを隠すことができます

(define get-y
  (let ([y 0])
    (lambda () y)))

Lispのイディオムで、Let over lambdaというそうです
その代わりにこう書くことができます

(require racket/splicing)

(splicing-let ([x 0])
  (define (get-x) x))

で?と言いたくなりますが
定義したい関数が複数になると、こんな風に書いてたのが

(define-values (inc dec get)
  (let ([x 0])
    (values (lambda () (set! x (+ x 1)))
            (lambda () (set! x (- x 1)))
            (lambda () x))))

こう書けて楽ちん、ということのようです

(splicing-let ([x 0])
  (define (inc) (set! x (+ x 1)))
  (define (dec) (set! x (- x 1)))
  (define (get) x))

この間作ったstructの例ではdefineがいくつも出てきてましたが
beginで囲まれてました
状態を持たせてdefineを複数書きたいときには重宝する、ってことでしょうか

scheme修行のときはマクロなんてないので、
複数の関数を定義する代わりに
複数の関数を返すひとつの関数を作ってましたね
あれもなんとなくカッコよくて好きですが

spliceっていうのはschemeを勉強しだして始めて知った単語で
「皮をむく」という意味です
`(1 2 ,(list 3 4))(1 2 (3 4))になりますが
`(1 2 ,@(list 3 4))(1 2 3 4)になります
,unquoteの略記ですが,@unquote-splicingの略
確かに皮がむけてます

splicing-letとunquote-splicingは直接的な類似はないように思えますが
上の例でsplicing-letの代わりにletを使ってしまうと
defineが隠されてしまいますから、皮がむけてると言えますね

 

達成!

RacketのMacroを調べてみる (4)

なんと下書きだけしてアップしてなかった分が!

----

再掲

> (define-syntax (our-if-v2 stx)
    (define xs (syntax->list stx))
    (datum->syntax stx `(cond [,(cadr xs) ,(caddr xs)]
                              [else ,(cadddr xs)])))

めでたい?
dの数とか数えたくないですね?
パターンマッチが使えます
同じ内容をパターンマッチで書くとこうなります

> (require (for-syntax racket/match))
> (define-syntax (our-if-using-match stx)
  (match (syntax->list stx)
    [(list name condition true-expr false-expr)
     (datum->syntax stx `(cond [,condition ,true-expr]
                               [else ,false-expr]))]))

これでdを数えなくて済みます
こうでないと

matchはいろいろ書けるみたいなんですが実はまだよく知りません

(require (for-syntax racket/match)) というのはmatchを使うために必要なおまじない

もう少し詳しく言うと、Racketのソースが実行されるタイミングには2種類あります
compile timeとrun time、またはsyntax phaseとruntime phaseとも言います

普通にプログラムが実行中なのがrun timeで、
ソースをコンパイルしてるときがcompile time
マクロ、というかsyntax transformerはcompile timeに実行されます

で、compile time中に使えるライブラリは、run time中に使えるライブラリより
絞ってあります
matchは絞られてしまってるので、requireで使うよと言ってるわけです
for-syntaxっていうのはcompile time中に使うよ、という意味です

compile-time中に使いたい関数を自分で定義する場合は
defineの代わりにdefine-for-syntaxを使うか、
あるいはdefineをbegin-for-syntaxでかこんでやります