「君の名は。」考察 2度目を見る前に
ネタバレありです
1度見た人だけ読んでください。
2度目見る前に整理しておきたいことを箇条書きでまとめていきます。
あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ あ
モデル
現実の飛騨にあのようなカルデラ湖の街は存在するの?
簡単に調べた限りはなさそう 飛騨市のサイトには、架空の街と書いてある。 | 総合案内 -飛騨市公式ウェブサイトへようこそ-
諏訪湖がそのような地形らしいが印象が異なる。
瀧が通っていた高校のモデルは?
新宿東南口を出て歩いていると見かける東京都立新宿高等学校? 一瞬、劇中でも校門が映るが名前の確認ができなかった。
瀧の家は?
おそらく総武線の東側のどこかというか、目の前には森がありその背景には、新宿の街並み。森と街並みの距離感を忘れてしまったが、ここら辺であれだけの森があるとしたら、明治神宮、新宿御苑、上野公園。 上野公園は遠すぎる気がするし、明治神宮は南側なので違う気もする。新宿御苑の東側に住んでいたのかな? となると瀧の最寄駅は、信濃町駅、四谷駅が一番可能性高そう。 劇中で降りているシーンあったのかも?
⇨信濃町が正解みたい。 ▶︎聖地巡礼【君の名は。】~信濃町周辺~ : 気まま気ままに聖地巡礼
瀧のバイト先のイタリアンはどこ?
▶︎聖地巡礼【君の名は。】~瀧のアルバイト先~ : 気まま気ままに聖地巡礼
瀧が高校時代に通っていたカフェはどこ?
?
ラストシーンはどこ?
瀧が新宿駅南口、三葉が千駄ヶ谷駅で降りて探し始めた。ということは代々木駅らへん? あそこら辺ってラストシーンの通り、傾斜が多くある閑静な住宅街だからあってるかな?
⇨正解は、四谷の須賀神社 ▶︎聖地巡礼【君の名は。】〜須賀神社〜 : 気まま気ままに聖地巡礼
お互いどういうルートで探したんだろう(笑 須賀神社 - GoogleMap
途中の飛騨のコンビニのワンシーンは、秒速5cmの種子島のコンビニ?
現地に行って印象に残っていたのでそんな気がします。パロでしょうか?
時系列など
前回彗星が落ちたのは何年前?
彗星は1200年周期と言っているが、ニュースでは「1000年ぶり」と言っている。 ニュースでは1200年をざっくり1000年と言っているだけ?
カルデラのような地形は今回落ちた隕石とは別に2カ所ある。
1つは糸守湖で、もう1つはご神体の場所。 つまり過去に2回は隕石が落ちている。今回は3回目。
劇中で糸守湖が隕石湖と言及されていることから、1200年前に糸守湖の場所に隕石が落ちたことは間違いない。 そのためご神体がある場所には、さらに1200年前に落ちたということになる。 ご神体は立派な神社ではない単純な祠ということからも古い年代だと推測できる。
2400年前の被災者は、隕石落下の中心地にご神体を配置して、祠の天井には隕石の絵を残した。 1200年前の被災者は、神社、巫女の舞、組紐、口神酒を文献とともに伝承として残した。
200年前の繭五郎の大火では何があったのか?
単純に火事で彗星の伝承の記録が消えたというだけで深い意味はなさそう。
なぜ瀧が入れ替わる対象に選ばれたの?
三葉が瀧に紐を渡したから⇨三葉が瀧に紐を渡したのは、三葉が元々瀧と入れ替わっていたからでは?⇨あれ?
選ばれたというより昔から転生したいて、そういう運命にあった?後述。
なぜ口神酒を飲むと過去に戻って三葉と入れ代われたの?
過去に戻って三葉と入れ替わったけど、死んだ時間軸の三葉はどうなったの?
劇中のキャラクターの年齢
三葉は17歳、瀧もおそらく17歳。 実際には3年ずれているので、三葉が17歳の時、瀧は14歳。 先輩と会ったのは、瀧が17歳だった時の5年後のため瀧は22歳、三葉は25歳。 瀧が就活をしていることを考えると大学4年生のはずであるから、5年前は瀧が高校2年生、彗星が落ちたさらに3年前は瀧が中学2年生。
再開した時はサラリーマンだったから、翌年?
3年前の中2の瀧よりも、高2の三葉の方が背が高い
実はオープニングで、並んでいるシーンでそれが確認できる。しっかり伏線になっている。
けど総武線の代々木駅で紐を渡しシーンでは瀧の方が少し背が高い
あれ? この理由がわかりません。
瀧は3年前に紐を貰っていたけど、入れ替わっている時はつけていなかった?
飛騨に探しに行った時はつけていたけど
祭りの当日、突然三葉が髪を切った理由は?
祭りの前日に中2の瀧に会いに行ったが、覚えてもらえていなかったことにショックを受けて切った。 学校を休んだ理由も同じ。
監督は、万葉集の小野妹子の歌を参考にしている。万葉集は約1200年前に成立。そして劇中で彗星の周期も1200年前。
「君の名は。」 新海誠&神木隆之介 生出演SP!世界が注目 監督のここがスゴイ ! - YouTube
小野妹子の歌「思ひつつ寝ればや人の 見えつらむ 夢と知りせば 覚めざらましを」 「夢の中で愛しい人を見た 夢と知っていたならば もう少し夢を見ていたかった」
まさに瀧と三葉の思いを述べたような歌。
口噛み酒の文献で一番古く残っているものも同じく万葉集
以下、引用
https://transpace.jp/nihongo/machizake/
【訓読】 君がため 醸みし待酒 安の野に 独や飲まむ 友無しにして 【仮名】 きみがため かみしまちざけ やすののに ひとりやのまむ ともなしにして 【原文】 為君 醸之待酒 安野尓 独哉将飲 友無二思手 【大意】 君と一緒に呑もうと想って醸(かも)しておいた待ち酒だが、君は「安の野」に私をおいて旅立っていく。後は、一人で友もなくこの待ち酒をのむことになるのか。 【作者】 大宰帥大伴卿
こちらも映画のテーマに似ていますね。
水宮家の入れ替りわりについて
劇中のセリフで母親の二葉、祖母の一葉にも入れ替わったことがあることがわかる。 父親の話はanotherに描かれているらしい。母親の二葉と父親の入れ替わりのストーリーもあるのかな?
水宮家は女性しか登場しない
もしかして大昔から女系で全て婿養子? それは巫女の舞を踊って伝承するため? 途中で遺影が映るシーンあったけど、顔を確認すれば女性が同じ顔で男が全然違う顔だったりするのかな
眠っている最中に瀧が聞く「タキくん、タキくん、覚えてない?」というのは電車で聞いた時の台詞と同じ?
そんな気がするけど覚えてない
2人が起きた直後に泣いているのは、彗星の問題が解決した後で、お互いを忘れてしまっているけど喪失感があるため?
ちょっと時系列整理してみれていない
監督
新海監督曰く「これまでの経験が全て詰め込まれた作品」
最後は秒速5cm風。
途中もそういうシーンが多いのかも
監督曰く「ライティングが自由」
太陽光が2箇所から差していたりするらしい
野暮なツッコミ
3年間のズレがあったということは、日付と曜日もズレていたはず・・・
「君の名は。」 新海誠監督 神木隆之介 スッキリに出演 (08/26) - YouTube
こちらの映像を見ると9/9(金),9/11(金)9/12(Mon)、真ん中の曜日がおかしい。これは作画ミスかな。 ちなみに9/9(金),9/12(月)が該当するのは今年の2016年、このシーンは瀧の携帯を見ているため未来が2016年であり、過去が2013年であることがわかる。ちなみにラストシーンは5年後なので2021年東京オリンピックの翌年である。
2013年の9/9(月)、9/11(水)、9/12(木)である。 三葉の携帯シーンは劇場で再確認したい。
あとこの3年間というのが絶妙で、6年前の2010年だとスマートフォンを持っているユーザーは少ないためおかしい。 スマートフォンの普及させたと思われるiPhone 4の発売日が2010/6/24である。
瀧はなぜ入れ替わっている時に住所調べなかったの?
調べていたけど、目覚めると同時に忘れてしまっていただけかな。 糸守町の名前すら覚えていなかったようだし。
勅使河原クレイジー
友達のとんでも発言を間に受けて、変電所爆破してしまう行動力。 さやかの台詞から勅使河原はもともと三葉のことが好きだったようだが、それにしても不思議である。 何か信じる根拠みたいな伏線があったのかな?
RADWIMPSの歌詞について
まず曲のタイトルが君の名は。のストーリーとは合わない。 主人公の前世の話は一切出てこない。
ドラマや映画などのテーマ曲でよくある、雰囲気は合わせているが楽曲には楽曲独自の世界が存在していて、映画やドラマなどとは直接関係ない、というパターンかなと軽く考えていた。 しかしインタビュー記事などを読んでみると、今回の楽曲は監督の新海誠とRADWIMPSが協力して2年間かけて作成されたものである。 それがまさかストーリーと関係ないなんてはずがない。ということで再考してみた。
ニコ生で神木君が「もう1度RADWIMPSの曲を聞いてから見に行ってほしい」と言っているので歌詞がストーリーとか関連しているのは間違いなさそう。
前前前世とは?
前前前世 (movie ver.) - RADWIMPS - 歌詞 : 歌ネット
この歌の主題が主人公の瀧だとすると、「前前前世」とは瀧が前前前世から転生しながら人を探していて、現在の瀧にはその記憶がない。というのが一番単純に想像がつくストーリー。
つまり
- 前前前世⇨2400年前に1回目の隕石によって探し人が死んでしまった人、ご神体を作った人?
- 前前世⇨1200年前に2回目の隕石によって探し人が死んでしまった人、小野妹子?
- 前世⇨現代、3回目の隕石によって探し人が死んでしまった人、瀧?
歌っているのは、瀧が転生した人物。
でこれらは全て同じ人間の生まれ変わりであるということか?
歌っているのは瀧が転生した人だとして、探している相手は誰か?というと、以下の歌詞からおそらく三葉の転生した人物であることが想像できる。
遥か昔から知る その声に 生まれてはじめて 何を言えばいい?
遥か昔から2人は転生を続けてお互いを探し続けている。ということ?
あと以下の歌詞から、今までは毎回必ずどちらかが死んでしまっていて、愛し合うことができずにいて、転生して探すということを繰り返している? つまりこれは、瀧の時代に三葉が助からなかった未来?
君が全然全部なくなって チリヂリになったって もう迷わない また1から探しはじめるさ むしろ0から また宇宙をはじめてみようか
スパークル
スパークル (movie ver.) - RADWIMPS - 歌詞 : 歌ネット
運命だとか未来とかって 言葉がどれだけ手を 伸ばそうと届かない 場所で僕ら恋をする
この2人は時間概念とは別の世界で恋をしていることを表現している?
時計の針も二人を 横目に見ながら進む
これも同じで、時間は進んでも2人には2人の時間軸があることを示している。
そんな世界を一生 いや何章でも 生き抜いていこう
ここも転生を示唆している?
参考
- 「これまでの経験が全て詰め込まれた作品」 www.youtube.com
自分用メモ
ズートピアのキャラクターのモデルを考えみた
世界観
- ズートピア=アメリカ
- ZPD=FBI
草食動物
- 草食動物=マジョリティー(白人)
- ウサギ=あなた
- ウサギの両親=中産階級の白人両親(悪意なく差別)
- 羊副市長=トランプ?ヒラリークリントン?(戦争賛成、イラスム原理主義の過激派をの危険性を訴える)
- ガゼル歌手=被差別を訴える南米系白人歌手(この声優のプロフィール)
- バッファロー署長=白人警官
肉食動物
- 肉食動物=マイノリティー(非白人)
- キツネ=メキシコ系移民ヒスパニック(差別されて生活、貧困層)
- イタチ=アフリカ系黒人(盗難、海賊版DVD販売など)
- トラ=黒人警官、(警察署には肉食も草食もいるけどトップは白人で現場には黒人が多い)
- ライオン市長=オバマ(黒人のアメリカ大統領、黒人、白人に人気あり、テロリストを捕まえて拷問)
- 凶暴化肉食動物の保護施設の狼=CIA(と思ったけどCIAは白人が多い組織なはず、わからない)
- 肉食動物の凶暴化=テロリスト
- 夜の遠吠え=アッラーフアクバル
- 交通局の怠け者=動物自体に意味はなく役所の手続きの遅さの揶揄
- ネズミ=イタリア系移民(ゴッドファーザー)
- ネズミの手下の白熊=黒人マフィア、
日本人が出てこないなと思っていたら、こちらを発見。 ブログデンティティー ズートピア
ネズミサイズの小さなアイスを何本も作ってレミングたちに売りさばき大儲け。 一匹が買ったら全員買うレミングのサラリーマンは、なんとなく日本人サラリーマンを揶揄している気がします。
なるほど
レミングで調べてみるとこんな記事も レミングの集団自殺神話 第一章 レミングの集団自殺について (Introduction)
日本人の周りと同じ行動をとるという国民性を、一緒に行動をするという性質を持つレミングで表現しているようです。
しかしレミングは草食動物なんですよね。当初の予想の草食動物=非白人から外れてしまいます。 肉食動物はアメリカでのマイノリティで、草食動物は先進諸国のその他の人たちという括りが正しいのかもしれません。
あとユダヤ人はどこかに描かれているはずだとは思うのですがわかりませんでした。 差別されていて金を稼ぐという意味ではキツネがユダヤ人という可能性もありますけど、子供の時にボーイスカウトでいじめられているので違うかと思います。
これ以外にもより細かくキャラクター設定は決まっていそうですね。
他にもズートピアのキャラクターのモデルやシーンの現実との対比に気がついた方は教えてください。
JAL国内ツアー 【ツアー】予約確認・座席指定・eチケットお客さま控発行、JMBお得意様番号登録方法
公式サイトに上記手順が見つからないので記事にしてみました。
共通
- 1 JAL国内線−航空券 予約・空席照会・運賃案内−にアクセス
- 2 国内線ご予約・購入済みのお客様をクリック
- 3 【ツアー】予約確認・座席指定・eチケットお客さま控発行 をクリック
- 4 必要な情報を入力して検索するをクリック
- 5 あとは予約確認・座席指定・eチケットお客さま控発行、JMBお得意様番号登録を実施してください。
eチケットお客さま控発行の場合
1 先ほどのページ下部にスクロールして、タッチ&ゴーで搭乗する という項目の、eチケットお客様控えを発行するをクリック
2 送信したいユーザにチェックを入れてメールアドレスを入力して送信するをクリック
3 完了
スノーボードのビス(ネジ)、ショートビスについて
スノーボードのビスは専用品としてネットで1000円くらいで売っていますが、わざわざ高価な専用品を買う必要はありません。 ホームセンターやネット通販で安価に購入することが可能です。
ビスの紹介
ビスの種類としては、「トラス頭 小ネジ サイズ M6 ピッチ1mm」が一般的なスノーボードで使われるものになります。 長さは一概には言えませんが、「 16mm」が一般的なビスで、「 15mm」が国産の板で利用することが多いショートビスになります。(長いものだと17mm,短いものだと14mmが最適な場合もあるようです) どちらを買えばいいかわからないという方は、安価ですので両方を買って試してみましょう。
購入
これらはホームセンターで1本30円 * 8で合計240円になります。ホームセンターに在庫がなかった場合には、工具通販モノタロウで「トラス頭小ネジ M6」と検索してみてください。
検索で一番上にヒットしたレビュー件数が多い「(+)トラス頭小ねじ(ステンレス)」を買いましょう。 2016/2/7(日)現在では32個入りで689円になります。専用品の8個入りより安いです。 材質としては、ステンレスと鉄の2種類が検索でヒットしますがスノーボードでは錆びにくいステンレスが一般的のようです。
他にも購入可能なサイトを見つけたので貼っておきます。 ステンレス SUS316L(A4)(+) トラス頭 小ねじ (全ねじ)
その他こだわりポイント
材質の違いによる重量の違い
より軽量な材質であるチタンのビスを使ってみると良いかもしれません。約半分の重量になります。(参考ステンレス1本5g, 8本で40g、チタン1本2.2g、8本で17.6g、22.4gの差になります) 大した差ではないですね・・・
緩み止め加工
ステンレス(+)トラス頭 小ねじ (全ねじ) (アロック加工・緩み止処理)
おまけ 詳細説明
条件の一致が必須な項目
スノーボードのビスは以下のスペックになります。
- トラス頭(ネジの頭の部分の形状)
- 小ネジ(ネジの種類)
- M6(ネジの直径)
- ピッチ 1mm(ネジの回すところのサイズ)
必須ではない項目
- 長さ 15mm or 16mm(ネジの長さ) バインと板の組み合わせによる。
- 材質 ステンレス、鉄、チタン(ネジの材質) 普通はステンレス、金があるならチタンでもよし
- 緩み防止加工 アロック加工(ネジの止めるところの緩み防止の加工) 金があるならあロック加工してあるのでもよし
- 表面加工 ? (錆び防止などのための加工) よくわからないけど色々ある模様
clang-format Style Options 日本語翻訳 & サンプル集 #clang #llvm
随時更新予定
概要
clangにはclang-formatと言うフォーマッタが存在しておりC言語,C++,Objective Cのインデントなどのファイルフォーマットを自動的に揃えることができます。(vim,emacs,SublimeText向けプラグインも用意されています。)
これらのフォーマットスタイルを詳細に設定可能なのですが、各設定項目が具体的にどういうものかイメージできないので、実際に試して確認していきたいと思います。
いずれはすべてのオプションの意味を理解したいのですが、まずは標準で用意されている LLVM, Google, Chromium, Mozilla, WebKitのフォーマットの差分から特徴的なオプションから日本語訳していきたいと思います。 またC++だけに適用されるフォーマットの優先順位は下げています。
デフォルトオプションの確認方法
以下のようなコマンドを実行すると、styleに指定したオプションが具体的にどのようなものかわかります。
clang-format -style=llvm -dump-config
clang-format Style Options
AccessModifierOffset
intのためマイナス指定可能 publicのindent幅? よくわからずAlignEscapedNewlinesLeft
よくわからずAllowAllParametersOfDeclarationOnNextLine
Allow putting all parameters of a function declaration onto the next line even if BinPackParameters is false.
???BinPackParameters
If false, a function call's or function definition's parameters will either all be on the same line or will have one line each.
???AllowShortIfStatementsOnASingleLine
true or false
括弧なしのif文を1行にするかどうか
- if (a) - printf("sample"); + if (a) printf("sample");
- AllowShortLoopsOnASingleLine
true or false
括弧なしのwhile文を1行にするかどうか
- while (a) - printf("sample"); + while (a) printf("sample");
AlwaysBreakTemplateDeclarations
for C++
If true, always break after the template<...> of a template declaration.AlwaysBreakBeforeMultilineStrings
???
If true, always break before multiline string literals.ConstructorInitializerAllOnOneLineOrOnePerLine
for C++ ?SpacesInParentheses
true or false
"("の後と")"の前にスペースを入れる
-switch (a) { +switch ( a ) {
- SpaceInEmptyParentheses
true or false
空白括弧()の中にスペースを入れる
- int test() { + int test( ) {
- SpacesInCStyleCastParentheses キャスト時の括弧()の中にスペースを入れる。
- int abc = (int)def; + int abc = ( int )def;
- SpaceAfterControlStatementKeyword 制御文の後にスペースを入れる。
- switch(a) { + switch (a) {
- SpaceBeforeAssignmentOperators 演算子の前にスペースを入れる。
- int a= 1; + int a = 1;
- IndentCaseLabels
true or false
caseラベルをswitch文からインデントするかどうか。
switch (a) { - case 1: - printf("1"); - break; + case 1: + printf("1"); + break; }
- BreakBeforeBraces
中括弧{}のスタイル設定
Attach, Linux, Stroustrup, Allman or GNU
Attach
-int test12345(int a, int b, int c) -{ - if (a == 1) - { - printf("abc"); - } - else { +int test12345(int a, int b, int c) { + if (a == 1) { + printf("abc"); + } else { printf("def"); } return 1; } -int test1111(int a){ - if (a == 1){ +int test1111(int a) { + if (a == 1) { printf("a"); - }else{ + } else { printf("d"); } return 0; }
Linux
int test12345(int a, int b, int c) { - if (a == 1) - { - printf("abc"); - } - else { + if (a == 1) { + printf("abc"); + } else { printf("def"); } return 1; } -int test1111(int a){ - if (a == 1){ +int test1111(int a) +{ + if (a == 1) { printf("a"); - }else{ + } else { printf("d"); } return 0; }
Stroustrup
int test12345(int a, int b, int c) { - if (a == 1) - { - printf("abc"); - } - else { + if (a == 1) { + printf("abc"); + } else { printf("def"); } return 1; } -int test1111(int a){ - if (a == 1){ +int test1111(int a) +{ + if (a == 1) { printf("a"); - }else{ + } else { printf("d"); } return 0; }
Allman
int test12345(int a, int b, int c) { if (a == 1) - { - printf("abc"); - } - else { + { + printf("abc"); + } + else + { printf("def"); } return 1; } -int test1111(int a){ - if (a == 1){ +int test1111(int a) +{ + if (a == 1) + { printf("a"); - }else{ + } + else + { printf("d"); } return 0; }
GNU
いわゆるGNUスタイルとは少し違うような?
-int test12345(int a, int b, int c) -{ - if (a == 1) - { - printf("abc"); - } - else { +int test12345(int a, int b, int c) { + if (a == 1) { + printf("abc"); + } else { printf("def"); } return 1; } -int test1111(int a){ - if (a == 1){ +int test1111(int a) { + if (a == 1) { printf("a"); - }else{ + } else { printf("d"); } return 0; }
BreakBeforeBinaryOperators
2項演算子の改行に関する設定、詳細未確認BreakBeforeTernaryOperators
3項演算子の改行に関する設定、詳細未確認BreakConstructorInitializersBeforeComma
???PenaltyReturnTypeOnItsOwnLine ? 関数定義の返り値の方指定を1行に書くかどうか? けどint指定だから別の意味のような気がする。 よくわからず
PointerBindsToType
*や&を型の右に配置(true),変数の左に配置(false) true
- int *tset; + int* test; int* abc;
false
int *tset; -int* abc; +int *abc;
DerivePointerBinding
ファイルを解析して最も多い配置に従って、*や&の位置を決定する。 PointerBindsToTypeを自動判定するようなもの?SpacesBeforeTrailingComments
命令とコメントの間のスペース幅。1行内にコメントを記述する場合。
1を指定した場合
-int *tset;/* test value */ +int *tset; /* test value */
- AlignTrailingComments
true or false
命令の後に続くコメントが複数行続く場合にアラインを整える。
int *tset; /* test value */ -int *abc; /* abc value */ +int *abc; /* abc value */
IndentFunctionDeclarationAfterType
If true, indent when breaking function declarations which are not also definitions after the type.
詳細不明 関数宣言に関するインデント?Standard サポート言語
Cpp03, Cpp11 or Auto
C89とかはないようです。IndentWidth
インデント幅ContinuationIndentWidth
行継続のためのインデント幅
Indent width for line continuations. 詳細不明TabWidth
タブの幅UseTab
タブを使うかどうか
Never, Always or ForIndentationColumnLimit
行の最大文字数
ここで指定した文字数を1行で超えると改行される。MaxEmptyLinesToKeep
最大空白行数
指定前
printf("test"); return 1;
1指定
printf("test"); return 1;
参考
ClangFormat — Clang 3.5 documentation
Clang-Format Style Options — Clang 3.5 documentation
clang-format-diff.py実行時のエラーの解決
エラー
# clang-format-diff.py Traceback (most recent call last): File "/usr/local/bin/clang-format-diff.py", line 24, in <module> import argparse ImportError: No module named argparse
解決
easy_installをインストールして、easy_installでargparseを導入する。
mkdir /usr/local/src/python cd /usr/local/src/python wget http://peak.telecommunity.com/dist/ez_setup.py python ez_setup.py easy_install argparse clang-format-diff.py a usage: clang-format-diff.py [-h] [-i] [-p P] [-style STYLE] clang-format-diff.py: error: unrecognized arguments: a
初めての関数型言語 #emacs #lisp #ruby
概要
1年ぶりにemacs lisp環境を整理していて、文字列のリストの各要素に特定の文字列を追加するということがしたくなりました。
しかし今まではemacs lispは他の人のの設定をコピペしたり変数に代入する程度のことしかしたことがなく、いざ書こうととしたら宣言型ではまったく書けません。 (仕事ではC言語でバリバリの手続き型)
ということで、それを解決するまでの過程ををまとめていきたいと思います。
いきなりemacs lispはハードルが高いので、まずは文法に少しは慣れているRubyで書いてみたいと思います。 1歩1歩進んで行きましょう。
Rubyで手続き的に書いてみる
具体的にやりたいことはこういうことです。
root_dir = "/home/sona_tar/"; inc_dirs = ["include", "test/include","abc/include"]; include_dirs = Array.new; inc_dirs.each {|dir| include_dirs.push(root_dir << dir); } p include_dirs;
実行結果
$ ruby loop.rb ["/home/sona_tar/include", "/home/sona_tar/test/include", "/home/sona_tar/abc/include"]
とりあえず手続き型ではできました。 普段はC言語で書いているので配列の要素番号を指定して値を参照しなくて済むだけで高級に感じます。
Rubyでmapを使って書いてみる。
続いてmapを使ってみます。
root_dir = "/home/sona_tar/"; inc_dirs = Array["include", "test/include","abc/include"]; include_dirs = inc_dirs.map {|dir| root_dir << dir } p include_dirs;
実行結果
$ ruby loop.rb ["/home/sona_tar/include", "/home/sona_tar/test/include", "/home/sona_tar/abc/include"]
すっきりしました。いちいちリストに追加するという処理を記述する必要がありません。
Rubyでlistに対する処理だけで記述してみる。
冗長ですがこんな書き方もできますね。
root_dir = ["/home/sona_tar/"]; inc_dirs = Array["include", "test/include","abc/include"]; include_dirs = root_dir.product(inc_dirs).map {|dir| dir.join } p include_dirs;
実行結果
$ ruby loop.rb ["/home/sona_tar/include", "/home/sona_tar/test/include", "/home/sona_tar/abc/include"]
emacs lispで手続き的に書いてみる
これを書くのが一番苦労しました。 その割りに空のリストの宣言だったりループしてたりとかっこ悪い。
(setq root_dir "/home/sona_tar/") (setq inc_dirs '("include" "test/include" "abc/include")) (setq include_dirs) (dolist (dir inc_dirs) (setq include_dirs (cons (concat root_dir dir) include_dirs))) (message "%s" include_dirs)
実行結果
M-x eval-buffer (/home/sona_tar/include /home/sona_tar/test/include /home/sona_tar/abc/include)
emacs lispでcollectを使って書いてみる。
続いてcl-loopとcollectを使ってみます。
(setq root_dir "/home/sona_tar/") (setq inc_dirs '("include" "test/include" "abc/include")) (setq include_dirs (cl-loop for dir in inc_dirs collect (concat root_dir dir))) (message "%s" include_dirs)
実行結果
M-x eval-buffer (/home/sona_tar/include /home/sona_tar/test/include /home/sona_tar/abc/include)
emacs lispでmapcarを使って書いてみる。
続いてmapcarとlambdaを使ってみます。
(setq root_dir "/home/sona_tar/") (setq inc_dirs '("include" "test/include" "abc/include")) (setq include_dirs (mapcar '(lambda (dir) (concat root_dir dir)) inc_dirs)) (message "%s" include_dirs)
実行結果
M-x eval-buffer (/home/sona_tar/include /home/sona_tar/test/include /home/sona_tar/abc/include)
まとめ
関数型言語風に書くとloopの記述と状態を保持するリストへの追加処理がなくなり、副作用のないすっきりしたコードになりました。
ただし慣れるまでは頭の使い方が違うので、どのように書けばいいのか考えるのに苦労します。(emacs lispは手続き的に書く方が難しかったですがw)
要訓練です。
もっとスマートな書き方がRubyやemacs lispでありましたら教えてください!
参考
Emacs Lisp勉強会(基礎編) — ありえるえりあ
Emacs Lispのメモ
Loop Facility - Common Lisp Extensions