Code Aquarium

minazoko's blog -*- 水底のブログ -*-

(Clojure) 標準出力 - オンライン判定コード提出用テンプレその2

前回投稿では標準出力周りが微妙な感じで終わってしまいました。折角なのでどうすれば出力も楽になるか考えてみました。こんなテンプレになりました。 (def in-seq #(line-seq (java.io.BufferedReader. *in*))) (def s->long #(Long/parseLong %)) (defprot…

(Clojure) 標準入力 - オンライン判定コード提出用テンプレ

最近PaizaのオンラインハッカソンやCodeIQの出題コードを問いたりして遊んでいます。 この手のサイトでは標準入出力を使います。 出力はともかく標準入力読み取りを毎回考えて書くのは無駄なのでコピペできるテンプレを用意するのが常套手段のようです。 と…

(PowerShell) 簡易 timeit

Windowsでコマンドの処理時間計測したい場合みなさんどうしてるんでしょうかね。 PowerShell使えばそういうコマンドがあるだろうと思ったのですが、いやあるにはあるんです Measure-Command が。 PS C:\wk> measure-command {ping localhost}でもこのコマン…

(Racket) トップレベルbeginの継続が捕捉できない

仕様?バグ? #lang racket (define cc '()) (begin (display 'A) (call/cc (lambda (k) (set! cc k))) (display 'B)) (cc) ;; なにも表示されない。 call/ccの継続は (display 'B) を実行してトップレベルへ戻る処理の筈。だけど保存しておいた継続を実行し…

(Racket) composeマクロ

composeマクロを作る 関数合成を行うcomposeは通常関数で提供されます。それをマクロで作るとどうなるかという話。昨日即興で書いた物が全然ダメダメだったので再挑戦です。使用するのは syntax-rules。 compose1 と compose Racketには2つのcompose関数が…

(Scheme) syntax-rulesの引数が1つのパターンは省略できる?

前からあやふやだったので確認してみた。 これでandマクロが作れるのは違和感がある。 (define-syntax myand (syntax-rules () ((_) #t) ((_ e1 e2 ...) (if (not e1) #f (myand e2 ...))))) (_ e1 e2 ...) が引数2つ以上を表すならば、上のマクロ定義では…

(ClojurClr) clojure.xml の代替品

clojure clr には何故か未だ clojure.xml が移植されていないようです。JavaのSAX APIと .Net の XML APIがまるっきり異なっているので後回しにされている、といったところでしょうか?代替品もなさそうなので適当に書いてみました。https://gist.github.com…

(Clojure) vsClojureを触ってみた

この記事は Clojure Advent Calendar 2014 - Qiita 15日目の記事です。 まえおき 去る2014/11/12、無償オープンソース版VisualStudio である VisualStudio Community 2013 が公開されました。Pro相当で機能的な制限はなし。となれば、Clojureの.Net版である …

(Racket) draw-text における文字回転

draw-textによる縦書きは、文字列を分割して一文字ずつ置いていくのが簡単です。ただしカタカナの長音記号は横棒のままになっていますので、文字を回転して描画します。 回転したい文字の中心に座標原点を移動 (set-origin) さらに座標系の回転(rotate) そし…

(Racket) racket/gui で年賀状宛名書き

このエントリは Lisp Advent Calendar 2014 - Qiitaの8日目の記事です。 racket/guiで年賀状印刷してみようとした。 いろいろ未完成感が漂ってますが、取りあえずこんな感じのものができました。 mnzk/nenga-print · GitHub 年賀はがき画像はこの辺から拝借 …

(Racket) 無名関数をcutで評価

lamda式等で無名関数を作り即時評価するコードは次のようになります。 ((lambda (x y) (* x y)) 5 7) ;=> 35 このように無名関数のコードが短ければいいのですが長くなると適用される引数をずっと後ろの方に書く事になり可読性が下がります。 ((lambda (x y)…

(Racket) values->list マクロとか

無いっぽいので... (define-syntax values->list (syntax-rules () ((_ vs) (call-with-values (thunk vs) list)))) (define-syntax values->vector (syntax-rules () ((_ vs) (call-with-values (thunk vs) vector)))) (define-syntax values->hash (syntax…

(Racket) member-keyの話

とりあえずクラスの基本 racketではクラスは次のように作成します。 (define sub-class% (class super-class% (super-new) ...)) racketのクラスは単一継承で必ずなんらかのクラスを継承しなければなりません。この例では super-class%クラスを継承した sub-…

(Racket) Class の External Name Control

RacketのClassシステムの説明にある Internal / External Names がピンと来なかったので、サンプルを書いてみました。 公式ドキュメントでは 比較対象にJavaのprotectedを例にあげていますが、むしろ C++ の friend に近いような気がします。Racketのdefine-…

ifマクロ

Gaucheでifマクロを書いてみた。 マクロ名は if だとアレなので %if とする。 当然ながら if case cond といった分岐用特殊形式の使用は禁止。 else無指定への対応すると煩雑になるので2つに分けています。 (define-macro (%__if test then else) `((assoc-…

(Gauche)バブルソート

今読んでいる数学ガールガロア理論がバブルソートにちょっとだけ触れていました。 考えてみるとバブルソートは何となく概要を知っている程度で、実装した記憶がありません。振り返るとバブルのつもりが結局挿入ソート的な物を書いて終わってることが多いよう…

(Gauche) sort における #"|a|" の(?) 謎挙動

[追記] 本件、早々に突っ込みをいただきました。 @mnzktw #"|a|" は只の定数文字列"|a|"になるので、比較関数が引数に関わらず定数値を返しているためだと思います。多分意図したのは #"~|a|" じゃないでしょうか。— Kilo Kawai (@anohana) 2014, 10月 11#"|…

(Gauche) 2chお題「そろばんAA」

2ちゃんねるプログラム板 プログラミングのお題スレ Part5 より 252 名前: デフォルトの名無しさん [sage] 投稿日: 2014/10/08(水) 21:14:41.09 ID:QOSwbYHc お題: 整数n(0<=n<1000000)をソロバンのAAに変換するプログラムを書け n=9563なら ######## #oo|…

(Racket) generatorでFizzBuzz

racketにもgeneratorライブラリがあるので、前回のgaucheのコードを移植……しようとした。しかしracketのgeneratorは汎用ストリームのように使うには、どうにも使いづらかった……。 steramとの相互変換が出来ればもっと楽できそうなんだけど。 #lang racket (r…

(Gauche)generatorでFizzBuzz

毎度似たような FizzBuzzを書いていますが、gaucheでgeneratorを使ったバージョン。無限リストを3本作ってマージするこの方式は、n f b を受け取った後、n をとるか f b をとるかの判定部分が泥臭くなります。 今回はパターンマッチを使って多少はすっきり…

素数列挙した人々

といっても、ガウスやオイラーのような歴史的偉人の話ではありません。Web上で素数リストを作ったり公開されたりしてる方々です。 最初に見つけたのはそのまんなURLのこちら Prime number list 2014/9現在、9997954969 までの素数がダウンロードできます。10…

(PowerShell)PowerShellで素数列挙

素数列挙スクリプト 素数列挙したくなったので、お手軽にPowerShellで書いてみました。 素数をファイルに保存し続けます。強制中断しても、再開するときに保存した素数を読み込んで続きから列挙。64ビット整数の範囲で延々素数を列挙できます。gist: primes.…

(BAT)バッチで年月日時分秒

Windowsのバッチスクリプトで年月日時分秒を表す数列を得る方法。 ファイルのバックアップ時などに欲しくなることあるよね。日付は環境変数DATEで取得できます。 > echo %DATE% 2014/07/09変数名の後にコロン+チルダを書いてその後ろにスライスする要素の先…

(Clojure)when-let と some->>

タイトルを見て何のことか想像つく人には多分つまらない話です。ついでに nil と seq というキーワードも追加します。おそらく想像通りの内容です。あしからず。 少し長い前置き 前のエントリで逆引き天気予報のプログラムを書きましたが、書いていて何か違…

(Clojure)サーバーにやさしい逆引き天気予報

[追記] tenkijp の rss サービスが終わってしまいました。下記プログラムももう使えません。 はじめに 今更感ありますが、天気予報を取得するプログラムを書いてみました。 コードはこちら データはtenki.jpのこちらから。 ポイント clojure.core.cache で取…

(PowerShell)複数行コメントはネスト不可

PowerShellの複数行コメントは で終わります。 ここはコード <# ここはコメント ここはコメント ここはコメント #> ここはコード ネストは一見できてそうに見えるけど、できません。 ここはコード <# -- コメント開始 ここはコメント <# -- ただのコメント …

(#PowerShell) ODAC でOracle操作

PowerShellでODAC (Oracle Data Access Components) PowerShellとOracleで検索するといくつかサンプルコードが見つかります。 しかしどうも釈然としない、コレじゃない感。すなわち ADO.Netに含まれる System.Data.OracleClient や OleDbではなく、Oracle社…

(PowerShell)ScriptBlockで文脈を作る。あと年賀状も。

この記事は,PowerShell Advent Calendar 2013の7日目の記事です。 なお、私のPowerShell環境は V3 です。以下すべて検証は V3でのみ行っています。 ScriptBlockで文脈を作る ScriptBlockで高階関数を作るとコンテキストをカスタマイズしているかのようなコ…

(PowerShell) $inputはコンテキストが違うと別物である

$inputはコンテキストが違うと別物である 勘違いしていました。 下記の4つのパイプライン変数 $input は同じものなんだろうなと思い込んでいましたが、違うものでした。 function my1 { $input } function my2 { begin{ $input } process{ $input } end{ $in…

(PowerShell) パイプラインはProcessで

2つのパススルー関数 サンプルコードその1 PowerShellの関数は一風変わっていて、内部に3つの役割をもったブロックを書くことができます。 function pass1 ([string] $Tag, [int]$MSec = 0){ begin{ Write-Host "BEGIN pass1 $Tag" } process{ [System.Thr…

(PowerShell)ダイナミックスコープなReduce

$1. 関数内再帰関数で Join-Paths 最初にちょっと寄り道。 前回エントリでは、引数を配列にして3つ以上のパス要素連結関数を書きました。 Join-Path 同様に可変長の引数にすることは出来ないでしょうか? できました。 function Join-Paths{ function rec (…

(PowerShell)配列の先頭要素だけ取り出す

分配束縛っぽい記述を使うと、配列の先頭要素と残りを分割できます。 $x = 1..5 $y,$z = $x $y #=> 1 $z #=> 2 3 4 5Lispの car と cdr の動作ですね。これは再帰処理と相性が良い形です。 例えば、PowerShellのパス文字列連結コマンドレット Join-Path は2…

(PowerShell) 配列を横一列に表示する

PowerShellでは、デフォルトでは配列は要素ごとに改行されて表示されます。 PS C:\> 1..5 1 2 3 4 5Write-Host を使うと、横一列に出力されます。 PS C:\> Write-Host (1..5) 1 2 3 4 5また、文字列内で変数展開を行うとスペースで連結した一行の文字列が得…

(Clojure)JavaFX2とseesawの連携

JavaFX2には JFXPanel という swing向けのコントロールがあります。 これをswingのJFrameに載せると、swing内で動くJavaFX2アプリが作れます。swingでできるってことは seesawでもできるはずですよね。 というわけで試してみました。「連携」というほどのこ…

それ sequence-m でできるよ

はじめに clojure.algo.monadsを使ってみました。 お題 例えば”Hail2U”という文字列を元にして、["hail2u","hail2U","haiL2u","haiL2U","haIl2u","haIl2U","haIL2u","haIL2U" ,"hAil2u","hAil2U","hAiL2u","hAiL2U","hAIl2u","hAIl2U","hAIL2u","hAIL2U" ,"H…

..

あまりにもぐだぐだな上、誤情報も含まれていたため削除します。

Java 8 を関数型っぽく使うための(中略)をClojureでやってみた

はじめに このエントリーは、Java8のlambda式についてのエントリー派生シリーズへの便乗記事です。まだ下の記事を見ていない方はリンク先を見ておいてください、そうしないと意味がわかりません。 Java 8を関数型っぽく使うためのおまじない - きしだのはて…

(Clojure)短絡評価なsome->マクロ

ぼくのかんがえたスレッディングマクロその2 評価がnilになったら即抜けるsome->とsome->> (ns cool-macros (:refer-clojure :exclude [some-> some->>])) (defmacro ^:private some->* [form & exprs] (let [[e-first & exprs] exprs [e-last & exprs] (re…

clojure.inspectorをちょっとだけ見やすく

(require '[clojure.inspector :as insp]) (import 'java.awt.Font) (defn find-children [^java.awt.Component co ^Class cls] (some->> co .getComponents (filter #(instance? cls %)))) (defn custom-inspect-tree [data] (let [font (Font. "VL Gothic"…

ぼくのかんがえたスレッディングマクロ

cond-> も as-> みたいにシンボルを指定できたらいいと思いました。 (defmacro cond-as-> [init name & forms] (when-not (even? (count forms)) (throw (IllegalArgumentException. "require an even number of forms"))) (if-not forms init `(let [~name …

Clojureでファイルパスの正規化

(def user-home-path (System/getProperty "user.home")) (defn get-canonical-path [^String path] {:pre [path]} (-> (cond-> path (.startsWith path "~") (.replaceFirst "~" user-home-path)) java.io.File. .getCanonicalPath)) ClojureというかJavaの…

instaparseでCSVパーサーを書いてみる

instaparseは文脈自由文法(CFG)による構文解析ライブラリです。ほぼそのままのEBNFと正規表現を使えます。ここでは手ごろなところでCSVの解析器を作ってみます。 leiningenプロジェクト依存モジュール 何はともあれproject.clj。最低限必要なライブラリは以…

some->でヌルポ回避

どってことないことですが、ふと気づいた。 (when-not (nil? obj) (.method obj)) は (some-> obj .method) と書けば短いしobjの出現を一回だけにできるね。*1 *1:もしかして常識だったり?

Emacs Lisp で as-> マクロ

Clojure1.5のas->マクロをelispで。 (defmacro as-> (expr name &rest forms) `(let* ((,name ,expr) ,@(mapcar '(lambda (f) `(,name ,f)) forms)) ,name)) 本家Clojureの実装はこんな感じ (defmacro as-> [expr name & forms] `(let [~name ~expr ~@(inter…

Clojure1.5 の New Thread Macro

Githubを眺めていたらClojure1.5でcoreに追加される新しいスレッドマクロが目にとまりました。スレッドマクロ大好きなのでちょっと気になり試してみました。 ● as-> これが一番分かりやすく出番もありそうです。 (require '[clojure.string :as string]) (as…

Clojure-Pyでファイルリード

●テキストファイルを読む 行単位で遅延リードしてテキスト処理。 ファイル終了判定は空文字列との一致判定。pythonのreadlineは行末に改行をくっつけたまま読み込むのでファイル終端でなけれな空行でも空文字列にはならない。 (defn repeatedly [f] (lazy-se…

Clojure-PyでWin32API

Clojureからネイティブライブラリ Pythonにはctypesというネイティブライブラリをダイレクトに扱うモジュールがあります。ということはClojure-Pyを使うとClojureからネイティブが呼べるということになりますね。 ;;-*- coding:utf-8 -*- (ns sample-ctypes …

遅延リスト遊び - Emacsで学ぶLazyな世界(後編)

前編に引き続き、使うのはEmacs Lispです。 -*- 遅延リスト -*- ものすごく基本的なことを書きます。 二つのオブジェクトのペアを作る関数consがあります。このペアはドット対とも呼ばれますが、cdr部がnilの場合、真のリスト*1になります。またcdr部が真の…

遅延リスト遊び - Emacsで学ぶLazyな世界(前編)

(これは、Lisp Advent Calendar 2012の20日目の記事です。)長いので前後編に分けます。お暇な方はどうぞ。 -*- delayとforce -*- 正格評価の言語でもクロージャがあれば遅延評価を行うことができます。計算式をクロージャに包んでしまえば、クロージャが呼…

もう一度、関数の引数をlexical-letするマクロ

昨日の「関数の引数をlexical-letするマクロ」が中途半端だったので、拡張してみた。 組み込みdefunと, clモジュールのdefun*のそれぞれに対応したものを作成。ヘルプで見たときにdocstringの位置が明示されるように、引数の調整もしました。 (require 'cl) …