nozomのひとりグループ日記 RSSフィード

2006-10-24

define-syntax遊び

| define-syntax遊び - nozomのひとりグループ日記 を含むブックマーク はてなブックマーク - define-syntax遊び - nozomのひとりグループ日記 define-syntax遊び - nozomのひとりグループ日記 のブックマークコメント

(define-syntax calc
  (syntax-rules ()
    ((_ . x)
     (eval (infix->prefix 'x)))))

普通に電卓になる。

(calc (1 + 2) * 3)
==> 9

infix->prefixはこんなの。

;; References:
;; 
;; [1] xyzzy Lisp Programming
;; http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp18.html
;; 
;; [2] 2ch CommonLisp Scheme Part12 No.73-75
;; http://www.bookshelf.jp/2ch/tech/1100229366.html#73
;; 

(define (operator-precedence op)
  (case op
    ((+ -) 1)
    ((* /) 2)
    (else 9)  ; 認識不能
    ))

(define (infix->prefix exp)
  (cond ((not-pair? exp) exp)
        ((single-list? exp)
         (infix->prefix (car exp)))
        (else
         (let rec ((arg1 (infix->prefix (car exp))) (restexp (cdr exp)))
           (let ((op1 (car restexp)))
             (cond ((null? (cdr restexp))
                    ;; Missing operand
                    (error "Invalid expression"))
                   ((null? (cddr restexp))
                    ;; No more operators
                    (list op1 arg1 (infix->prefix (cadr restexp))))
                   (else
                    (let ((op2 (caddr restexp)))
                      (if (< (operator-precedence op1)
                             (operator-precedence op2))
                          ; eg. op1=+, op2=*
                          (list op1 arg1 (infix->prefix (cdr restexp)))
                          (rec (list op1 arg1 (infix->prefix (cadr restexp)))
                               (cddr restexp)))))))))))

某所でdefine-syntaxの楽しさを伝えきれなくて悔しかったので。

キーワード作成

22:33 | キーワード作成 - nozomのひとりグループ日記 を含むブックマーク はてなブックマーク - キーワード作成 - nozomのひとりグループ日記 キーワード作成 - nozomのひとりグループ日記 のブックマークコメント

設定画面からキーワードの新規登録はできないのかな?

とりあえずただのWikiとして使ってみる。

欲しいものリスト

C#はLispか? delegateはlambdaの別名だった(かもしれない)

| 23:08 | C#はLispか? delegateはlambdaの別名だった(かもしれない) - nozomのひとりグループ日記 を含むブックマーク はてなブックマーク - C#はLispか? delegateはlambdaの別名だった(かもしれない) - nozomのひとりグループ日記 C#はLispか? delegateはlambdaの別名だった(かもしれない) - nozomのひとりグループ日記 のブックマークコメント

(d:id:carbuncle:20061023#cより)

static Object fib_cps_03(Object arg, Function k)
  {int n = (int)arg;
     return (n == 1 || n == 2)
            ? k(1);
            : fib_cps_03(n - 1,
                         delegate(Object v1)
                           {return fib_cps_03(n - 2,
                                              delegate(Object v2)
                                                {return k((int)v1 + (int)v2);});});}}
トラックバック - http://nozom.g.hatena.ne.jp/nozom/20061024