タグ

ブックマーク / saito.hatenablog.jp (10)

  • 定義、曲げられたスコープの中で - 主題のない日記

    hchbaw
    hchbaw 2010/09/24
    [let/scope][scheme][bend][lisp]
  • let/scope が Ypsilon で動かない - 主題のない日記

    大抵のプログラミング言語では名前解決はほとんど空気みたいなものだ。 いちいち意識したりしない。 言語によってはルールが複雑だったり奇妙だったりすることもあるが、あくまで言語に組込みの機能であって、カスタマイズの余地はあまりないのが普通だ。 その中で Scheme の datum->syntax は特異な機能だと思う。 スコープの規則を曲げることが出来る。 以前にスコープの規則を曲げる例として let/scope というマクロを書いた。 再掲する。 (define-syntax let/scope (lambda(x) (syntax-case x () ((k scope-name body ...) #'(let-syntax ((scope-name (lambda(x) (syntax-case x () ((_ b (... ...)) #`(begin #,@(datum->sy

    let/scope が Ypsilon で動かない - 主題のない日記
    hchbaw
    hchbaw 2010/09/24
    [let/scope][scheme][bend][lisp]
  • スコープを曲げる - 主題のない日記

    何度か取り上げたような気がするが、 Scheme のマクロ機構における datum->syntax の第一引数の意味が未だによくわからない。 あらためて規格を読んでみることにした。 (datum->syntax template-id datum) template-id はテンプレート識別子であり、datum はデータ値でなければならない。 この手続きは template-id と同一の文脈情報をもつ datum の構文オブジェクト表現を返す。 このとき、この構文オブジェクトは template-id が挿入されたのと同時にコードに挿入されたかのようにあつかわれる。 ここで「文脈情報 (contextual information)」という言葉がよくわからない。 更に続きの文を見ると… datum->syntax をつかうと、その識別子がもともと入力にあったかのようにあつかわれる暗黙の識

    スコープを曲げる - 主題のない日記
    hchbaw
    hchbaw 2010/09/24
    [let/scope][scheme][bend][lisp]
  • 動的変数 - 主題のない日記

    ISLISP には動的変数 (ダイナミックスコープの変数) の仕組みがある。 名前空間が分離されており、参照には特殊演算子 dynamic を用いる。 この方式であれば Scheme で再現するのは簡単そうだと思えたのでやってみた。 (library (dynamic-variables) (export dynamic-let defdynamic dynamic set-dynamic) (import (rnrs) (rnrs control (6)) (rnrs exceptions (6)) (rnrs conditions (6)) (rnrs mutable-pairs (6))) (define dynamic-chain '()) (define global-dynamic-variables '()) (define (add-dynamic-variables va

    動的変数 - 主題のない日記
  • cut の拡張 - 主題のない日記

    cut は Scheme でプログラミングする上で頻出するマクロだが、先日述べた様にネストした内側にスロットを入れられないといった制約もある。 実装の困難さや、利用の際にミスを誘発しやすくなるといったデメリットを考慮したのだろうけども、それよりも「どういう仕様にするのが自然なのか」を確定するのが難しいという理由が最も大きいと思う。 ネストした内側までスロットを入れられるのならば cut 自体をネストした場合にはどうなるべきなのかとか、内側で <> という名前を導入してたらそれより下の <> はスロットとみなさないようにするのがいいとか、そしたら一貫性に欠けるとか、そういうことである。 そんなことを考えていると、以下のような記事を見掛けた。 Gaucheで、 (map (lambda (x) (* x x)) '(1 2 3)) をcutを使うなら、どう書けばいいんだろう。 cut内で特定の

    cut の拡張 - 主題のない日記
  • スロット番号付き cut - 主題のない日記

    前の記事 (id:SaitoAtsushi:20080810:1218355014) では引数を複数回使う機能を持った cut について考察した。 それについて参考になる文章を shiro さんから紹介してもらったので、ここにメモしておく。 http://srfi.schemers.org/srfi-26/mail-archive/msg00018.html http://srfi.schemers.org/srfi-26/mail-archive/msg00020.html 私は英語があまりわからないのでかなりおおざっぱな理解ではあるけれども、番号による参照は混乱しやすいので変数に適切な名前を付けるべきというのが提案者の主張のようだ。 実際に cut は充分に便利であるし、 cut では機能不足と思うようなものは cut でやるべきことではないのだろう。 と、まあ考察はここまでにして、ス

    スロット番号付き cut - 主題のない日記
  • $ と cut - 主題のない日記

    Gauche には $ というマクロがこっそり入っている。 まだ改良の余地があると考えているらしく、ドキュメントにはまだ記載されていない。 Haskell の $ をヒントにしたそうで、具体的には以下の例のとおりに展開される。 ($ f a b c) => (f a b c) ($ f $ g a b c) => (f (g a b c)) ($ f $ g $ h a b c) => (f (g (h a b c))) ($ f a $ g b $ h c) => (f a (g b (h c)))インデントが深くならないというのはあるにしても、記述が短くなるわけでもなく、便利な場面があるか私は疑問に感じていた。 ところが、「どう書く?org」で出題されていた「文字列に含まれる単語の最初の文字を大文字にする」という問題を解こうとして $ を使う機会があり、考えが変わった。 まず、私が書い

    $ と cut - 主題のない日記
  • Schemerは再帰を使わない - 主題のない日記

    プログラミング言語schemeはLispの一種である。Lisp系全般に共通するようにschemeもまたリストを基的なデータ構造として活用する。そして、反復処理には再帰を基的な考え方とする。はてなダイアリキーワードにおいてもSchemeの項には「Schemeプログラマはループよりも再帰を好む」と書かれている。 ところで、SICPの問題を解いた過程を記事にしている人が少なからずいるが、それを見ていて気付くことがある。例えば以下のような関数を見てみよう。 (define (accumulate-n op init seqs) (if (null? (car seqs)) '() (cons (accumulate op init (map car seqs)) (accumulate-n op init (map cdr seqs))))) http://d.hatena.ne.jp/com

    Schemerは再帰を使わない - 主題のない日記
  • mmm-mode - 主題のない日記

    私はMeadow上でhatena-modeを使ってはてなダイアリに書いている。はてな記法を認識して便宜を図ってくれるのでなかなか便利だ。だが、hatena-modeでC++やschemeのコードを書くのはやりづらい。文書中にそういったコードを入れる場合には別のバッファで書いてからコピペするという方法をとっていた。 ひとつのバッファの中でモードを混在させることは出来ないものか。それを解決するモードとしてmmm-modeというのがあると知った。 http://sourceforge.net/projects/mmm-mode/ 導入はマニュアルに従うとして、例えばhatena-modeで記述している途中にschemeのコードを記述したい場合の設定はこうなる。 ;; mmm-mode (require 'mmm-mode) (setq mmm-global-mode 'maybe) (set-f

    mmm-mode - 主題のない日記
    hchbaw
    hchbaw 2008/05/03
  • 被ブックマーク合計数取得API - 主題のない日記

    はてなダイアリ以外にもはてなが提供しているサービスはいくつかある。はてなアンテナやはてなブックマークだ。で、そのへんに関連する情報をXML-RPCを用いて問合せするAPIがあって、「被ブックマーク合計数取得API」はそのひとつ。 例のコードはPerlで書いてあるのだれども、ちょっとためしにGaucheを使って書いてみた。Gauche 0.8.8リリース記念ということで。 (use text.tree) (use sxml.tools) (use sxml.ssax) (use rfc.http) (define (make-request uri) (call-with-output-string (lambda(str-port) (write-tree `(,"<?xml version='1.0'?>" ,@ (sxml:sxml->xml `(methodCall (methodN

    被ブックマーク合計数取得API - 主題のない日記
  • 1