新しく変数を作って値を与えることを束縛といい、 すでに存在する変数の現在の値を変更することを代入ということが多いようだ。
個人的なリーダマクロとの距離感 Common Lispを常々使ってはいるのですが、 私個人としてはリーダマクロを定義したりすることが好きでないので 基本的に使う範囲は、標準で定義されているもの。 そしてCommon Lispで特徴的な機能としては 'read time evaluation'(#.)と'read time conditional'(#+ #-)あたりに限定されています。 さして面白くはない紹介になるかと思いますがお付き合い下さい。 read time evaluationの使い道 単体ではあまり活用していません。パターンとして使っているものを列挙します。 データ構造の初期値がread時に確定できるとき
この記事はLisp Reader Macro Advent Calendar 2012の記事です。 lisp方言のリーダーマクロの紹介という事で、Windows用テキストエディタ xyzzy のマクロ言語 xyzzy lisp よりole-readerをご紹介。 xyzzy lispのリーダーマクロ まずはxyzzyをあまり知らない人向けにxyzzy lispのリーダー機能について簡単にご説明。 xyzzyはいわゆる1つのEmacsenってやつですが、マクロ言語はCommon LispのサブセットになっているためEmacs Lispとは結構違う所があります。 マクロ言語として採用されているxyzzy LispはCommon Lispに近く6割程度の仕様が実装されている。 Emacs Lispとの互換性はあまり無い。その一方で、Windows APIにアクセスできるなど、Windowsネイテ
一言で言うと: xyzzy でも CL でも同じように書けるから 文字列で書くと... xyzzy でも CL でも文字列は大文字/小文字の変換などされないので、小文字はそのまま扱われる。defpackage でパッケージ名を文字列で書くと、パッケージ名に小文字を含んだパッケージが定義される。 これが CL では実質的に使い物にならない。そのままではシンボル名に小文字を含めることができないので、文字列で指定するかエスケープする必要がある。 ;; CCL (SLIME) にて CL-USER> (defpackage "foo" (:use :cl) (:export #:hello)) #<package: "foo"> CL-USER> (find-package 'foo) NIL CL-USER> (symbol-package 'foo:hello) ; Evaluation ab
ランダムステートの生成と利用 randomで乱数を得ることができますが、デフォルトの*random-state*とは別個にランダムステートを指定して利用することが可能です。 ランダムステートの生成には、make-random-stateを利用し、全く新規に作成、コピー等の使い分けが可能です。 同じランダムステートからは同じ結果が生じます。 ;;; 新規にrandom-stateを生成 (defvar *my-random-state* (make-random-state t)) (defun foo () (with-output-to-string (out) (dotimes (i 20) (write (random 36 (make-random-state *my-random-state*)) :stream out :base 36) ))) ;;; ループ内で都度オリジナ
Lispと言ったらマクロです。マクロが無いLispなんて使いたくありません。 というわけで、今回はとうとうLispを知らない人はその真髄を知ることのないマクロのお話です。 大上段に構えて、マクロとは、という説明をすることもできるのですが、そういうことばかりしていると嫌われるので、どんなことができるのか何故マクロでなければならないのか、というのが知らない人にとっては知りたい事だと考えています。 ・マクロを書く前に さて、では説明といく前に、一つだけ確認しておくことがあります。 Lispという言語の持つ特徴、異常な量の括弧、それがどんな意味を持つのか何故あんな見た目でなければならないのかという、誰もが抱く根源的な疑問に対する答えであります。 あの括弧の意味はLispにおいて使われる文脈での括弧と同一のものです。つまり、Lispのコードはそれ自体がネストしたリスト構造(cons)であるということ
負数が含まれる剰余を計算した場合、言語に跨がって一意な結果が得られない。 -5 % 3 5 % -3 C -2 2 C++ -2 2 Java -2 2 Ruby 1 -1 Python 1 -1 Common Lisp 1 -1 さて、なぜこんなことが起きるのかというと、剰余には複数の定義が存在するからである。 m ÷ n = q … rこの r を剰余と言うが、 r の範囲が 0 ≤ r < n 最小非負剰余 -n/2 ≤ r < n/2 絶対値最小剰余 の二つの定義があり、一般的には前者の「最小非負剰余」を用いるようである。 m が負数、 n が正数の場合は、先程の表にあるプログラミング言語は以下のように分類される。 絶対値最小剰余 C C++ Java 最小非負剰余 Ruby Python Common Lisp しかし、最小非負剰余では r が正数になる必要があり、剰余の結果が
Tag: 【募集中】 コンディションの補足には handler-bind を用います。 (defun parent () (handler-bind ((error (lambda (c) ...ハンドリング...))) ;; body (child1) (child2) (child3))) handler-bind の body 中でエラーが発生すると、 発生したエラーコンディションを引数 c として ハンドラ関数 が呼び出されます。 ハンドラ関数のうち、コンディションの型が合致しているものだけが呼び出されます。 そのため、例えば上の child1 が warning を発生した場合、用意されているハンドラが error 用ハンドラだけなのでそれは補足されません。(warningとerrorは別のクラス。) ハンドリングをうまく使うには さて、ここからがコンディションシステムと他の言語
2. 集合と同一性同一性とは x = x と言えるということです.どんな論理の教科書でも,どんな集合の教科書でも,まず x = x の確認から入ります.数理哲学の本ではこれだけで,延々と1章を充てたりしますが,ここではCommon Lisp をベースとして,集合概念のCLOS実現に向けての議論をします. セマンティックウェブの世界でもこの議論はあります.論理における記号(シンボル,a とか x )に相当するものは,セマンティックウェブの世界ではURI あるいは IRI です.ですから以後の議論で,シンボル a とか x が出てきたとき,それをセマンティックウェブの世界では URI あるいは IRI のことだと思ってください.ある記号(シンボル)を考えた時,同じ記号が違うものであるということはありません.この言い方だと何をいっているのかわかりませんから,同じ記号が違う意味であるということは
11.2 deftype, ユーザによる型定義CLOS によりクラス定義を行うと,それはそのまま Common Lisp の型となりますが,CLOS を使わなくてもユーザが自由に新しいデータの型を定義することができます.たとえば,XMLスキーマのデータタイプをLisp でも使いたいとしましょう.つまり,実質はLisp のデータなんだけれども,それを見かけ上,xsd データタイプとして使いたい,という場合です.そういうときに便利に使えるのがマクロ deftype です.xsd データタイプ定義をまとめてここに置いておきました.必要な方はダウンロードしてみてください. まずは簡単な場合から,cl:integer をそのまま xsd:integer として定義する場合には次のようになります. (deftype xsd:integer () 'cl:integer)ここでは先に xsd パッケー
11. Lisp の型システム CLOSはLisp の型システムに統合されています.CLOSの本格的な話に入る前に,Lisp の型システムの話をしたいと思います. 手元にあるLisp 関連の本で deftypeについての記述を調べたところ,CLtLとCLtL2は別として,記載のあったのはわずかにCharniakらのArtificial Intelligence Programming, ver.2 とPaul Graham のANSI Common Lisp だけでした.Paul Graham ではその記述は第14章のAdvanced Topics に入っていて,ひどいことには,普通のLisper は見なくていいみたいな書き方がしてあります.現在,Haskell,OCaml,F# と,型推論を有する関数型言語が実用期を迎えつつあるように思えます.Lisp には型はない,のではなく,ちゃん
エントリータイトル変更しました。 「オーバーフローしない」-->「オーバーフローする」 ●On Lisp の flatten はスタック溢れを起す (defun flatten-a (lis) (labels ((rec (x acc) (cond ((null x) acc) ((atom x) (cons x acc)) (t (rec (car x) (rec (cdr x) acc)))))) (rec lis nil))) 我が家の環境 (Ubuntu10.04LTS + Clozure CL) だと要素数 5万3千強でスタックが溢れる。下から2行目の右側の rec 再帰呼出しは返却値をそのまま返さず、他の関数に引数として渡している。しかし実は「他の関数」ではなく、渡している先はこれまた rec なので、これはこれでやっぱり末尾再帰のような気がする。 でも、スタックが溢れる。 ※
バンクーバー・ビール・ツアー バンクーバーはビールの街。ビールの醸造所、すなわちブルワリーがそこかしこに点在している。それはもう日本では考えられないほどの自然さで。 だからすっと入ったパブで、タップ(生)で置いているビールはほとんどが地元のもので、信じられないくらい新鮮だ。ぴんぴ…
タグジャンプ(jump-tag)できるようにするための何やら。 ローカル変数 ed:tags-find-target この変数にセットした関数が引数なしで呼び出されるので、カーソル位置の単語を調べて クラス名 名前 関数か否か を多値で返す。 3つ目の値は、nil なら変数、'lisp:structure なら構造体、それ以外なら関数、と扱われるっぽい(tags-find-entry-1 参照)のでそんな感じで。 この情報を元に XTAGS からジャンプ先のファイル名/ポイントを探してくれる。 参考: ${XYZZY}/lisp/tags.l jump-tag ローカル変数 ed:tags-find-point ジャンプ先のファイル名が見つかったらそのファイルを開いて、この関数が呼び出される。引数は以下の4つ。 クラス名(ed:tags-find-target から) 名前(ed:tags
XTAGS を作る(make-tags-file)ための何やら。 変数 ed::*maketag-list* XTAGS を作る時は ed::*maketag-list* に設定された (タグ作る関数 ワイルドカード...) に従ってワイルドカードにマッチするファイルをタグ作る関数で処理していく。 ワイルドカードの方は単にワイルドカードなのでテキトーに指定しておく。 対象のファイル毎にそのファイルの内容をバッファに読み込んでおいて(モードとか何もしてないので注意)、タグ作る関数が呼び出される。引数が2つ。 対象のファイル名(基本的には make-tags-file で指定したディレクトリからの相対パスっぽいのだが、絶対パスになってることがあるかも) その make-tags-file 実行でこれまでに作った XTAGS エントリの数 一応 make-tags-file が作成されたエントリ
コーディングスタイル逆引きCL:コーディングスタイルと合併しました Last modified : 2018/06/24 16:42:53 JSTPowerd by WiLiKi 0.6.1 on Gauche 0.9.10
「変数(シンボル)が値を束縛する」のか「値が変数(シンボル)を束縛する」のかわからなくなる時ありませんか。私はよく混乱します。正確にはどっちだったっけ?と。 Twitter / @`(,@valvallow): そういえばよくあることなんだけど、こないだもLisp ... そういえばよくあることなんだけど、こないだもLispの「束縛」の厳密な言い回しについて混乱した。「シンボルが値を束縛する」んじゃなくて「値がシンボルを束縛する」で良いんだよな。そこで、教えてもらったのが実にわかりやすかったのでここにメモっておきます。 Twitter / @leque: @valvallow 自分もよく混乱します。 unb ... @valvallow 自分もよく混乱します。 unbound variable と言うのだから束縛されるのは変数(シンボル)と覚えるとよい、と聞いてから大分混乱しなくなりました
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く