タグ

lispに関するpipeheadのブックマーク (154)

  • リリカル☆Lisp開発日記 » Blog Archive » スペシャル変数とLET

    Common Lispではdefvarを使ってグローバル変数を作ると、 その変数はスペシャル変数となり、無限スコープと動的エクステントを持つようになります。 (defvar *special* 99) (defun f () (let ((*special* 1)) (g *special*))) (defun g (x) (+ x *special*)) 上のプログラムから分かるように、*special*はどこからでも参照できます(無限スコープ)。 関数fのletにて、*special*に新たな値を設定すると、そのletを抜けるまでの間、 *special*の値は1に変わります(動的エクステント)。 よって、fのletがgにも影響して、 (f) => 2 となります。 しかし、これが正しく動作するのは*special*がスペシャル変数であるということを 処理系が知っているからです。関数f

    pipehead
    pipehead 2009/03/29
    無限スコープ, 動的エクステント
  • Common Lispの色々なループ - ありの日記

    例によって、実践Common Lispで勉強中です。マクロの話に入る前にループの話が出てきたので忘れないうちにやっておく。 実践Common Lispposted with amazlet at 09.03.23Peter Seibel オーム社 売り上げランキング: 131799 Amazon.co.jp で詳細を見る 第7章で出てきたループ構文は以下の4つ。 dolist dotimes do loop dolist これは、リストの内容を一つずつ変数に入れながらループを行います。foreach的な感じだと思う。以下の例は*num-list*変数に1〜5までの数字の入ったリストを用意しておき、dolistを使ってリストの要素を変数nに一つずつ格納してループを繰り返す処理になります。 CL-USER> (defvar *num-list* '(1 2 3 4 5)) *NUM-LIST*

    Common Lispの色々なループ - ありの日記
    pipehead
    pipehead 2009/03/23
    /* dolist, dotimes, do */ > doは確かに「見づらい」と不評なんですが、CL仕様策定者ガイ・スティールの弁によると、「カウンターを複数持って、カウンター内で全部の計算が平行で行えるのがCLのdoの強みだ」との事です。
  • 逆引き Common Lisp クックブック:コンディションを発生させる

    Tag: コンディション 普通のエラーを発生させる ハンドリングはあまり考えずに、最もシンプルなエラーを投げます。 (error "Error!") エラーがハンドリングされないと、指定されたメッセージがデバッガに表示されます。 コンディションの型は SIMPLE-ERROR になります。 continue リスタート付きのエラーを発生させる (cerror "Error!") コンディションの型は 同じく SIMPLE-ERROR です。 ただし、ハンドリングした際に (handler-bind ((error (lambda (c) (continue c)))) ...) とすることで、無視することができます。 デバッガでも CONTINUE メニューを選ぶことができるようになります。 実行時型チェックエラーを発生させる 型チェックを行い、指定の型でない場合にエラーコンディションを発

    pipehead
    pipehead 2009/03/10
    error, cerror, check-type
  • Common Lispの関数で色々な引数 - ありの日記

    Common Lispではいろいろな引数の渡し方がある。下の例は普通の関数の定義。 普通の関数 CL-USER> (defun foo (a b c d) (format t "a=~a b=~a c=~a d=~a" a b c d)) FOO CL-USER> (foo 1 2) ; 引数が足りない ; Evaluation aborted. CL-USER> (foo 1 2 3) ; これも引数が足りない ; Evaluation aborted. CL-USER> (foo 1 2 3 4) ; 引数の数が妥当なので以下の出力が得られる a=1 b=2 c=3 d=4NIL CL-USER> オプショナルパラメータ 引数を省略するような時はオプショナルパラメータとして定義しておく。そうすると常に決められれた数の引数をとりたくないときは省略することが出来る。これにはオプションとした

    Common Lispの関数で色々な引数 - ありの日記
    pipehead
    pipehead 2009/03/08
    > オプショナルパラメータとキーワードパラメータでは、「パラメータの名前 + supplied-p」という変数を定義すると、そのパラメータに値が設定された時はT(真)になり、設定されなかった場合はNIL(偽)となる。
  • LISPをみんなで勉強しよう! : Re: setqはset quote

    2009年02月18日06:17 by g000001 Re: setqはset quote カテゴリcommon lispg000001 こんにちは、g000001です。 トラックバックの方法が分かったので記念にエントリを書きます(笑) setqのqは、quoteのqというのはその通りで、1960年代中盤位までのLISPでは、「'」という表記がありませんでしたので (quote (1 2 3 4)) とか、 (define (quote (fib ...))) 等と書く必要がありました。その中でも頻繁に使われるsetと、quoteは一つにまとめられsetqになったのかと思います。 Common Lispでは、恐らくquoteの省略形の語尾のqはsetqのみですが、他の方言のINTERLISP等では、defineqや、rptq等々色々ありました。 「'」がリーダーマクロとして導入されてから

    pipehead
    pipehead 2009/02/18
    > setは、シンボルの値セルにしかアクセスせず、letで作られた環境にはアクセスしないというところで、(set' foo 42)と、(setf (symbol-value 'foo) 42)は同義になります。
  • progvの途中

    pipehead
    pipehead 2009/02/17
    > labelsの展開がうまくいってないらしく、内部関数名"#:progv-form350"が残っている。
  • シンボルを buffer-local にする4つの方法 - 日々ごちゃごちゃと考える

    なんかホッテントリメーカーくせぇ。 make-local-variable: 'symbol 現在のバッファでのみ buffer-local になる。setq とかしなくても local-variable-p が non-nil になる。 make-variable-buffer-local: 'symbol 全てのバッファで buffer-local になる。setq するまでは local-variable-p は nil のまま。 defvar-local: symbol value &optional doc 全てのバッファで buffer-local になる。setq するまでは local-variable-p は nil のまま。 つまり make-variable-buffer-local の初期値(と説明)を指定できる版。 setq-default: symbol val

    シンボルを buffer-local にする4つの方法 - 日々ごちゃごちゃと考える
    pipehead
    pipehead 2009/01/30
    make-local-variable, make-variable-buffer-local, defvar-local, setq-default
  • LISPをみんなで勉強しよう! : 無名というよりNull名関数

    2009年01月29日18:43 by g000001 無名というよりNull名関数 カテゴリcommon lispg000001 こんにちは、g000001です。 表題の件なのですが、Common Lispでは、シンボルにNull文字を使用することができます。 エスケープの方法ですが、通常\は利用したり||で囲んだりするのですが、Nullだけに、||で囲む他ありません。 そして関数の名前もシンボルになので実質付けたいように名前が付けられます。 (symbol-name '||) ;=> "" (defun || (n a1 a2) (if (< n 2) a1 (|| (1- n) (+ a1 a2) a1))) (defun fib (n) (|| n 1 0)) 実際的なところでは、例えば開括弧を読む関数名は、他の言語だとleft_paren_readerとかの名前になるかと思います

  • LISPをみんなで勉強しよう! : 無名というより匿名関数

    2009年01月28日20:49 by g000001 無名というより匿名関数 カテゴリcommon lispg000001 こんにちはー、今日から参加させて頂きます、g000001といいます。 よろしくお願いします。 表題のネタなのですが、 (progn (defun #1=#:fib (n a1 a2) (if (< n 2) a1 (#1# (1- n) (+ a1 a2) a1))) (defun fib (n) (#1# n 1 0))) のようにすると名前はあるのですが、実質名前で呼び出しができない関数が書けます。 上の例だと、#:fibがアクセスできない関数ですね。 実用性は不明ですが、クラスのスロットとかにインターンされないシンボルを使って隠蔽の真似とかできるかもしれません。 問題は隠蔽され過ぎてしまうところです(笑) 「common lisp」カテゴリの最新記事

    LISPをみんなで勉強しよう! : 無名というより匿名関数
    pipehead
    pipehead 2009/01/28
    インターンされないシンボルで defun
  • labelsとfletの違い - Nobuhisa's diary

    labelsは主に関数定義を入れ子にしたい場合に用いますが、fletというものもあるみたい。 外側(defun)と内側(labels,flet)の関数名が同一であった場合、内側の関数で再帰呼び出しをすると果たして誰にお呼びがかかるのか。labelsとfletはその時の振る舞いが異なるらしい。 labelsはあくまで自分自身。fletは外側の関数を呼び起こす。 ;; labels CL-USER> (defun foo (x) (format t "YesWeCan") (if (> x 0) (labels ((foo (x) (format t "!") (if (> x 0) (foo (1- x))) )) (foo x) ))) FOO CL-USER> (foo 5) YesWeCan!!!!!! NIL ;; flet CL-USER> (defun bar (x) (form

    labelsとfletの違い - Nobuhisa's diary
    pipehead
    pipehead 2009/01/23
    > 外側(defun)と内側(labels,flet)の関数名が同一であった場合、内側の関数で再帰呼び出しをすると果たして誰にお呼びがかかるのか。labelsとfletはその時の振る舞いが異なるらしい。labelsはあくまで自分自身。fletは外側の関数を
  • flet と labels の違い - 日々ごちゃごちゃと考える

    どこかでどっちかは再帰ができないとか聞いた気がしたので確かめてみた。 (defun hoge (&optional arg) 'defun) => hoge (flet ((hoge (&optional arg) (if arg (hoge) 'flet))) (values (hoge t) (hoge nil))) => defun => flet (labels ((hoge (&optional arg) (if arg (hoge) 'labels))) (values (hoge t) (hoge nil))) => labels => labels flet のローカル関数定義部分では、外のスコープの関数定義を参照する。labels のそれでは、labels で定義しているローカル関数を参照する。てことは labels では再帰できるが flet ではできない。 (flet

    flet と labels の違い - 日々ごちゃごちゃと考える
    pipehead
    pipehead 2009/01/23
    > flet のローカル関数定義部分では、外のスコープの関数定義を参照する。labels のそれでは、labels で定義しているローカル関数を参照する。てことは labels では再帰できるが flet ではできない。
  • 逆引き Common Lisp クックブック:命名の慣習

    ここでは、関数名や変数名の主な命名の慣習を挙げます。 変数名 *global-variable* 大域変数で用いられます。Common Lispの場合は、更にスペシャル変数であることを意味することが多いようです。 スペシャル変数に**が一貫して付いているのはCommon Lispの仕様策定の際に投票で議決された結果です。 constant-variable 大域定数。Common Lisp標準の大域定数は、飾りは付いていません (pi、most-positive-fixnum等々) 一貫して定数には何も装飾がされていないのはCommon Lispの仕様策定の際に投票で議決された結果です。 +constant-variable+ 比較的最近の慣習のようですがユーザ定義の定数で用いられます。 CLIM方面が発祥のようです。 関数名 foo1 foo-1 fooの補助関数を表わすことが多いようで

  • スコープとエクステントまとめ - t2ru's blog

    ABCLのソースを読んでるうちにスコープとエクステントについてだんだんわかってきたので、自分なりに少しまとめてみた。合ってるかどうかはわからないので、すべてに?がついていると考えてください。 スコープ アクセス可能な場所的範囲 エクステント アクセス可能な時間的範囲 言語 種別 スコープ エクステント コンパイラ・インタプリタでの検索方法(典型例) 実装上の領域(典型例) C ローカル(auto)変数 ブロック内 ブロックに入って時点から出た時点まで 関数の変数宣言リスト スタック C ブロック内のstatic変数 ブロック内 プログラムの開始から終了まで 関数の変数宣言リスト データ領域 C トップレベルのstatic変数 ファイル内 プログラムの開始から終了まで コンパイル単位の変数宣言リスト データ領域 C グローバル変数 ファイル内、extern宣言により別ファイルの変数を参照可

    スコープとエクステントまとめ - t2ru's blog
    pipehead
    pipehead 2009/01/15
    スコープ: アクセス可能な場所的範囲; エクステント: アクセス可能な時間的範囲
  • リリカル☆Lisp開発日記 » Blog Archive » displaced array

    Common Lispにはdisplaced arrayと呼ばれるものがあります。 これは他の配列へのポインタのようなもので、CLHSでは以下のように定義されています。 displaced array n. an array which has no storage of its own, but which is instead indirected to the storage of another array, called its target, at a specified offset, in such a way that any attempt to access the displaced array implicitly references the target array. (CLHS: Glossary-Section D) 試しに使ってみるとこんな感じです。 C

    pipehead
    pipehead 2009/01/03
    make-array のキーワード引数 :displaced-to と :displaced-index-offset
  • lispとrubyとpythonと その5 例外処理(lisp) - 遠い海

    try-finally的なことがしたいのであればunwind-protectでいい。 (defun aaa() (unwind-protect (progn (error "例外発生") (format t "処理・・・・")) (format t "後処理"))) (aaa) とすれば例外が発生しても(format t "後処理")は必ず実行される。 さらに凝ったことをしたいと思ったらconditionを使うことになる。 他の普通の言語になれてるとconditionはオーバースペックに見えてしょうがない。 conditionを覚えるならここ。 http://cl-www.msi.co.jp/solutions/knowledge/lisp-world/tutorial/condition-system.pdf これとhyperspecを読んでもwith-condition-restart

    lispとrubyとpythonと その5 例外処理(lisp) - 遠い海
    pipehead
    pipehead 2008/12/30
    signal, warn, error, cerror
  • 'fooと#'fooの違いは環境の違い

    QUOTEとFUNCTIONを使い分ける:もう少し詳しい説明 -- 逆引きCommonLisp をぼんやり見ていて、そういえば FUNCTION と COERCE では環境が違うってうちの CLISP が言ってたのを思い出した。 (funcall '(lambda (x) (1+ x)) 1) ;; => Error ;; *** - FUNCALL: argument (LAMBDA (X) (1+ X)) is not a function. ;; To get a function in the current environment, write (FUNCTION ...). ;; To get a function in the global environment, write (COERCE '... 'FUNCTION). CLHS にもそれらしい記述があったのでメモ。

  • 逆引き Common Lisp クックブック:QUOTEとFUNCTIONを使い分ける

    関数 QUOTEとFUNCTIONを使い分ける 関数を引数として渡す書法では、function(#')やquote(')が使われますが、使われる状況によって意味合いが変ってくることがあります。 局所関数と大域関数 quoteでは、大域の関数を参照(symbol-functionの値と同じ)しますが、functionではもっとも内側のスコープの関数を参照します。 (defun foo (&rest args) (format nil "global foo!!! => ~{~A~^ ~}" args)) (defun bar () (flet ((foo (&rest args) (format nil "local foo!!! => ~{~A~^ ~}" args))) (list (apply #'foo '(1 2 3)) (apply 'foo '(1 2 3))))) (bar)

  • Common Lispのformat関数

    Common Lispのformat関数 Common Lisp では,フォーマット出力用の関数として format が用意されています.巨大な Common Lisp の仕様の中でも特に複雑な組み込み関数の1つであり,中には冗談としか思えない機能もあったりします.Common Lisp使いの人でも,完全に使いこなしているという人は少ないのではないでしょうか. ということで, format 関数の使い方を自分でまとめて整理したものを公開します. 今まで ~S と ~A と ~% くらいしか使ったことがないという人は参考にしてみてください.ざっとネット上を検索したところ,仕様書以外で使い方を解説しているドキュメントは(少なくとも日語では)見当たらないので,少しは需要があるのでは. (参考文献) Common Lisp HyperSpec (22.3 Formatted Output) :処

  • 逆引き Common Lisp クックブック:数値を文字列に変換する

    Tag: 数値 数値を文字列に変換する write-to-string、prin1-to-string、princ-to-string などを使います (write-to-string 1234) ;=> "1234" (write-to-string 123.4) ;=> "123.4"

    pipehead
    pipehead 2008/12/09
    write-to-string
  • 逆引き Common Lisp クックブック:変数とスコープ

    変数とスコープ Common Lispでの変数は、大きく分けて3種類あります。 (ここでは、定数も変数に含めて話をします) 定数変数 スペシャル変数 レキシカル変数 定数変数 defconstantで定義でき、再代入も再バインドもできません。 「物の」定数(数学的な定数など)に使います。逆に言うと、それ以外の場合にはあまり使う機会は少ないでしょう。慣例により、定数変数名の前後に+を付けることが多いです。 (defconstant +pi+ 3.14) +pi+ ; => 3.14 ;;; 再バインドしようとするとエラーになる (let ((+pi+ 3.1415)) (+pi+)) ; => ERROR スペシャル変数(ダイナミック変数) スペシャル変数(またはダイナミック変数)は、他の言語でいうところのグローバル変数に相当します(ただし、いくつか特長があります)。スペシャル変数は、慣例

    pipehead
    pipehead 2008/12/01
    定数変数, スペシャル変数 (ダイナミック変数), レキシカル変数