Daysこの広告は、90日以上更新していないブログに表示しています。Words」問題)が出されていました。Worldと出力するプログラムを作成して下さい。数値、文字及び文字列リテラルを解答に含めることはできません。Perlのqqやqw、Rubyの%Q、%q、%wなども避けたほうが評価が高くなります。言語仕様をフル活用して下さい!ログイン│CodeIQ9/19に解答期限が切れて,自分の解答を公開することができるようになったので,Clojureで書いて提出した解答について適当に紹介してみようと思います。Clojureで解答を考えるにあたって,以下の方針を立てました:シンボルやキーワード,正規表現などのリテラルも使用しない文字列を使えるのとほとんど変わらず,チートっぽいマクロを使用しないシンボルが使いたい放題になるのでマクロも使わない「文字コードを算出して一文字ずつ表示」する方法は使わない面倒なうえにおもしろくないここまで制約を課すと,取れる方法はある程度限られてきます。僕が考えたのは,「コード中に書いた"Hello"や"World"といった識別子の情報をどうにかしてとってくる」方法です。その「どうにかしてとってくる」方法を2つほど考えました。World)まず考えたのはあらかじめ定義しておいたVarから名前をとってくる方法。var)で取得できます。Var自体を取得する方法としては,ここではVarをあらかじめユニークな値に束縛しておいて,名前空間からそのユニークな値に束縛されたVarを見つけてくる方法を取っています。とってこれはするんですが,このフォームもリテラルっぽい感じで今回は使用を控えました。ここまでが提出した解答その1なんですが,Varの名前を使う方法は突き詰めると下のコードまで短くできることに〆切が過ぎてから気づきました。world-msg)))次の解答はエラーメッセージから文字列を抽出する方法をとりました。Clojureが発生させる例外の中には,メッセージに変数名を含むものがあるので,その例外をキャッチしてメッセージから変数名を抽出します。発生させる例外はなんでもそれほど違いはありませんが,コンパイラが投げる類の例外はClojureの例外処理ではキャッチできないのでそういうものは避ける必要があります。以下の例外はキャッチできません。今回は,未束縛のVarを関数適用した際に出る例外を採用しました。残すはこのエラーメッセージの末尾のHelloを切り出してくるだけですが,問題は数値や文字,文字列,正規表現を使えない状況でどうやって所望の文字列を切り出してくるか。ムリクリ数値を作り出してsubstringで切り出すことはできなくはないですが,ダルいのでできればやりたくない。今回の解答では発想を転換して,Hello用のエラーメッセージとWorld用のエラーメッセージを用意して,共通部分を取り除く方法を使いました。おわりに今回のお題は「言語仕様をフル活用して下さい!」とのことだったので,Clojureのいろんな機能を使って解答を考えてみました。おかげで,細々とした部分の挙動(特にUnboundオブジェクトの扱いなど)で新しい発見もあって理解が深まりました。ここに掲載したコードは,Clojureのバージョンが上がったら結果が変わる可能性があるような微妙な振る舞いに依存している部分もあるので,なにかの参考にする場合には注意が必要かもしれません。おまけキーワードとマクロを使った解答も考えてみました。4はてなブログをはじめよう!athosさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。