タグ

ブックマーク / kazu-yamamoto.hatenablog.jp (14)

  • 正規表現を超える - あどけない話

    まずは、Audrey さんが言った Haskell の殺し文句を思い出して頂きたい。 正規表現ベースのパーサはメンテナンスしにくいのに気づいた? Parsec を使って 15分で Perl6 の完全なパーサを書く方法を勉強しましょう。 15分というのは誇張が入っていると思うが、正規表現が保守しにくく、Haskell の Parsec は強力で保守し易いのは事実だ。その理由を Perl と Haskell のコードを示しながら説明してみたいと思う。 Perl を愛する方に:この記事は Perl を攻撃するために書いたのではない。Perl を選んだのは、正規表現を広めた言語であり、僕がそれなりに Perl のコードを書けるためである。この記事の目的は、正規表現よりも関数型パーサー(Parsec)の方が優れていると示すことだ。 例題 この記事では例題として、IPv4 アドレスを解析する関数を書く

    正規表現を超える - あどけない話
  • 最高のHaskell入門書 - あどけない話

    輪講で「Programming in Haskell」をようやく読み終えました。このは、最高のHaskell入門書といって間違いないでしょう。 Programming in Haskell 作者: Professor Graham Hutton出版社/メーカー: Cambridge University Press発売日: 2007/01/18メディア: ペーパーバック購入: 2人 クリック: 67回この商品を含むブログ (22件) を見る 一緒に Haskell のを何か読もうという話が、友達との間で出たとき、最初は「The Craft of Functional Programming」にしようかと思っていました。ただ、出版社の人から「Programming in Haskell」を勧められたことがあったので、二冊を友達に提示したところ、直感で「Programming in Has

    最高のHaskell入門書 - あどけない話
  • 実践的な Haskell の本 - あどけない話

    Perl6 は何年経っても正式にリリースされません。そんな Perl6 を Audrey Tang さんは、たったの数ヶ月で作りました。その実装は Pugs と呼ばれています。短期間の開発を可能にした秘密兵器は Haskell です。 その Audrey さんが、2006年に日で Haskell について説明してくれました(資料)。残念ながら、そのころの僕は Haskell に興味がなかったのでチュートリアルは受けていませんが、その概要にはこう書かれています。 コーナーケースを探すのにユニットテストを書くのに疲れた? QuickCheck を使ってコンピュータに書かせちゃいましょう。正規表現ベースのパーサはメンテナンスしにくいのに気づいた? Parsec を使って 15分で Perl6 の完全なパーサを書く方法を勉強しましょう。デッドロックやレースコンディションはもううんざり? STM

    実践的な Haskell の本 - あどけない話
  • The Little Schemer - あどけない話

    最近、Scheme がちょっとした流行になっているようです。 Scheme を勉強しようと思っている人に、僕が声を大にして薦めたいは、「The Little Schemer」です。 The Little Schemer (The MIT Press) 作者: Daniel P. Friedman,Matthias Felleisen出版社/メーカー: The MIT Press発売日: 1995/12/21メディア: ペーパーバック購入: 10人 クリック: 137回この商品を含むブログ (91件) を見る 1章から7章にかけて、たくさんの例題とともに「再帰」が説明されています。「再帰の再帰」も勉強できます。実際、「このを読んで人生が変わった」という感想を何回か聞いたことがあります。なぜなら、物事を再帰で考えられるようになるからです。再帰が分らない人は、ぜひ読んで下さい。 8章は、「ク

    The Little Schemer - あどけない話
    IMAKADO
    IMAKADO 2008/04/04
    little schemer, repl
  • https://kazu-yamamoto.hatenablog.jp/entry/20080401/1207032525

    https://kazu-yamamoto.hatenablog.jp/entry/20080401/1207032525
  • 今日の Emacs 22 on MacOS (Leopard) - あどけない話

    Emacs Icon Collections がリリースされたので、ついでに Emacs 22 をバージョンアップしようと思い、EMACS_22_BASE を cvs update して、コンパイルしてみました。 すると、最後の最後で EmacsInstaller.dmg の作成に失敗します。よく調べてみると、/usr/bin/bc が異常終了していました。 % /usr/bin/bc dyld: Symbol not found: _history Referenced from: /usr/bin/bc Expected in: /usr/lib/libedit.2.dylib libedit.2.dylib の日付は、2007年12月14日でした。セキュリティアップデートか何かで更新されたんでしょうか? しょうがないので、MacPorts で bc を入れて、Emacs 22 をイン

    今日の Emacs 22 on MacOS (Leopard) - あどけない話
  • Electric な Ruby の end (4) - あどけない話

    という訳で、最新版です。関数呼び出しの括弧の中に if があっても大丈夫なはずです。 (defvar ruby-elect-keyword '("def" "if" "class" "module" "unless" "case" "while" "do" "until" "for" "begin" "end")) (defvar ruby-elect-regex (mapconcat (lambda (x) (format "\\<%s\\>" x)) ruby-elect-keyword "\\|")) (defun ruby-elect-end () (interactive) (insert "d") (when (and (char-equal (char-before (1- (point))) ?n) (char-equal (char-before (- (point) 2

    Electric な Ruby の end (4) - あどけない話
    IMAKADO
    IMAKADO 2008/03/25
    Electric end
  • On Lisp - あどけない話

    以前から、Lisp でのデザインパターンとは何かについて考えていました。それに答えを与えてくれそうな 「On Lisp」 というを読んでいます。 On Lisp 作者: ポールグレアム,野田開,Paul Graham出版社/メーカー: オーム社発売日: 2007/03/01メディア: 単行購入: 10人 クリック: 146回この商品を含むブログ (128件) を見る quote の副作用 長年 Lisper をやってきたのに、quote で作られたリストを返す関数に副作用があることを、恥ずかしながらこので初めて知りました。 たとえば、以下のような関数です。 (defun foo(expr) (append expr '(a b))) 実行してみましょう。 (foo '(1 2 3)) ;; => (1 2 3 a b) さてここで、foo の返り値に破壊的な関数 nconc を使って

    On Lisp - あどけない話
    IMAKADO
    IMAKADO 2008/02/21
    副作用
  • Lisp で多態性 - あどけない話

    On Lisp を理解するためのメモです。 オブジェクト指向Lisp オブジェクト指向Lispの章には以下のような記述があります。 CLOSの到来はLispがオブジェクト指向のパラダイムを取り込み始めた兆に見えるかも知れない.実際には,Lispはオブジェクト指向のパラダイムを今も変わらず含んでいると言う方が正確だ.しかしLispの底を流れる原則には名前が無く,オブジェクト指向プログラミングには名前があるので,現在,Lispがオブジェクト指向言語だと説く傾向がある.「Lispは拡張可能な言語で,その内部でオブジェクト指向プログラミングが容易に行える」と言う方が真実に近いだろう. そして、こうも書かれています。 実際,拡張性はオブジェクト指向スタイルの最大の利点の一つだ.プログラムは単一のモノリシックなコードの塊になるのではなく,小さい部品毎に書かれ,各々に目的に従ってラベルが付く.よって後日

    Lisp で多態性 - あどけない話
  • Emacs Lisp と総称関数 - あどけない話

    僕は Lisper ですが、「Lisp では、マクロを書けばなんでもできる」という主張には、かなり疑問を持っていました。 たとえば、「Emacs Lisp で総称関数を導入することなんてできない」と思っていたのです。しかし、今日ひらめいて、試しにこんなコードを書きました。 (defmacro defmethod (func <type> args &rest body) `(let ((type (intern-soft (concat (substring (symbol-name ',<type>) 1 -1) "p")))) (unless (fboundp ',func) (fset ',func (lambda (data &rest params) (catch 'loop (dolist (predicate-lambda (get ',func 'method)) (if

    Emacs Lisp と総称関数 - あどけない話
  • my-defstruct - あどけない話

    Emacs で (require 'cl) とすると defstruct が使えるようになります。ちょっと調べてみました。 大きなマクロで理解するのは困難 Common Lisp の defstruct なので、getter はあるが、setter がない という訳で、自分で実装してみました。 (defun my-keyword-number-pair (spec) (let ((len (length spec)) key ret) (dotimes (i len (nreverse ret)) (setq key (intern (concat ":" (symbol-name (car spec))))) (setq ret (cons (cons key i) ret)) (setq spec (cdr spec))))) (defmacro my-defstruct (type

    my-defstruct - あどけない話
  • Emacs Lisp のパターン - あどけない話

    デザイン(設計)パターンという程のことはない、Emacs Lisp のパターンを思いつくままに書きます。心は、 高階関数を書こう マクロを書こう です。 mapcar mapcar は、引数に関数をとる高階関数のよい例です。リストを取り、それぞれの値を加工して、新しいリストを返すパターンのときは、mapcar を使いましょう。 (mapcar '1+ '(1 2 3 4)) ;; => (2 3 4 5) mapcar には、自分のさせたい仕事を実装した関数を渡しましょう。 (defun f(x) (1+ (* x 2))) (mapcar 'f '(1 2 3 4)) ;; => (3 5 7 9) mapcar を連結しましょう。(オブジェクト指向でのメッセージの連結に似ていますね。) (mapcar '1+ (mapcar (lambda(x) (* x 2)) '(1 2 3 4)

    Emacs Lisp のパターン - あどけない話
  • Emacs Lisp のダメなところ - あどけない話

    Emacs Lisp をこよなく愛する僕の目から、Emacs Lisp がダメだと思うところをまとめておきます。 文化的な問題 Emacs Lisper の多くは、Lisp が好きで使っているのではなく、Emacs が好きだからしかたなく使っているのでしょう。当は C で書きたいのに、無理して Lisp を利用している感じです。 そのため、Emacs に付いてくる Emacs Lisp のコードは、Lisp らしくないものがほとんどです。単に C での発想を Lisp で表現しています。 これらのコードは、読みこなせないぐらい関数が大きく、副作用のある部分とない部分が分離されていません。また高階関数を用いて、データ構造を走査するコードと実際に仕事をするコードを分離するという意識も低いようです。 GoogleMapReduceという論文のお陰で、Lisp の写像関数(map)と畳込み

    Emacs Lisp のダメなところ - あどけない話
  • prototype.js 1.6 のクラス定義 - あどけない話

    prototype.js は 1.6 からサブクラスの定義が簡単になりました。使い方はチュートリアルを読んで下さい。ここでは、ソースを読んでみることにします。 Classオブジェクト Classというオブジェクトの定義は、以下のようになっています。 var Class = { create: function() { var parent = null, properties = $A(arguments); if (Object.isFunction(properties[0])) parent = properties.shift(); function klass() { this.initialize.apply(this, arguments); } Object.extend(klass, Class.Methods); klass.superclass = parent; k

    prototype.js 1.6 のクラス定義 - あどけない話
    IMAKADO
    IMAKADO 2007/10/28
    解説、 addMethods
  • 1