スマホから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がわかりやすいから読め
以上
まじすか
ここまでちゃんと理解してきたら上のドキュメントが読みこなせるはずだ、と
いうことらしいです
ということでここから「Syntax: Meta-Programming Helpers」読んでいく
話になります
長いからSMPHくらいの呼び名がいいかな
アートコミック まんが西洋美術史 1〜3
この間ちらっと書いた「まんが西洋美術史」って本なんですけど
思った以上によかったです
娘もしっかり読んでます
3冊1000円以下で買えたことを考えると超お買い得
定価で買ってても後悔はなかったと思います
思った以上に解説がかなりしっかりました 分量も多いし
ほんとにしっかりしてるかは美術に詳しいわけじゃないんでわからないんですけど
なんとなく気合を感じます
総ルビですが大人でも読める文章
マンガ部分は絵がウリになるほどではないですけど落ち着いて読めます
1巻の最初の方の絵は好きなんですが残念ながらそこだけ
ざっとひととおり読んだだけなんでこれからもぼちぼち読んでみようと思います
日本美術史の方も買おうかなあ
ブックオフに残ってるといいけど
あと、同じ出版社から「マンガ西洋美術史」ってのが出てます
こっちは2014年刊行で「まんが西洋美術史」は1994年刊行
20年経ったし新しいの作るか―みたいな感じなんですかね
取り上げてる時代も画家も監修も違ってるみたいなんで内容はかなり違うかも
Amazonで表紙見ただけですが絵柄は今どきっぽい雰囲気です
中身はわかりませんけど
でもちょっと興味あり
こんな感じでまんが科学史とかまんが数学史とか出してください>出版社さん
バロック…印象主義の美術 (アートコミックまんが西洋美術史)
- 作者: 馬淵明子,太田泰人,高階秀爾
- 出版社/メーカー: 美術出版社
- 発売日: 1994/08/31
- メディア: 単行本
- 購入: 1人 クリック: 3回
- この商品を含むブログ (4件) を見る
後期印象主義 20世紀の美術 (アートコミック まんが西洋美術史)
- 作者: 馬淵明子
- 出版社/メーカー: 美術出版社
- 発売日: 1994/10
- メディア: 単行本
- 購入: 1人 クリック: 4回
- この商品を含むブログ (4件) を見る
闇は近い?
今日はヨメがママ友といっしょだったんですけどね
ママ友のダンナの職場は休みが月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でかこんでやります
こんな日は
飲み会で遅くなると色々達成が難しいけどとにかく達成しておく
って今日はもう終わっちゃってるけど!