Code Aquarium

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

Lisp

(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 をとるかの判定部分が泥臭くなります。 今回はパターンマッチを使って多少はすっきり…

遅延リスト遊び - 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) …

関数の引数をlexical-letするマクロ

◎続編を書きましたのでそちらもよろしく。Emacs Lispを書いていると関数の引数が動的スコープで困ることがある。で、書いてみたマクロ (require 'cl) (defmacro* defun% (name args &rest rest) (let* ((docstr (when (and rest (stringp (car rest))) (car …