#:g1

Starsimの紹介

Posted 2014-05-30 06:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の150日目です。

Starsimとはなにか

 Starsimは、Connection Machine上で稼動した超並列Lisp処理系のシミュレーターです。

パッケージ情報

パッケージ名Starsim
ソース配布サイトAllegro CL Examples and Utilities: Starsim-f20 (archive.org)
参考サイト*Lisp - Wikipedia, the free encyclopedia

インストール方法

 Franzの配布サイトは最近結構落ちていますが、archive.orgからソースは入手できるので、ダウンロードしてきてセットアップします。
ちなみにSBCL等ANSI CLで動くようにして、ASDF対応したものがありますので、良かったらどうぞ。

 Quicklispのlocal-projectsディレクトリの中に設置して

(ql:quickload :starlisp)

でロードできると思います。

試してみる

 チュートリアルに出てくるオートマトンのコード例を紹介してみます。
繰り返しではなく、グリッド状に配置されたCPUに処理を投げるというイメージになります〈もちろんシミュレーターなので超並列ではありませんが…〉

(in-package :*lisp)

(*cold-boot :initial-dimensions '(16 16)) ;>> ;>> ;>> Thinking Machines Starlisp Simulator. Version 20.0 ;>> ;>> ;=> 1 ; (16 16)

(*defvar *automata-grid* 0) ;=> *AUTOMATA-GRID*

(ppp *automata-grid* :mode :grid :end '(8 5)) ;>> ;>> DIMENSION 0 (X) -----> ;>> ;>> 0 0 0 0 0 0 0 0 ;>> 0 0 0 0 0 0 0 0 ;>> 0 0 0 0 0 0 0 0 ;>> 0 0 0 0 0 0 0 0 ;>> 0 0 0 0 0 0 0 0 ;>> ;=> NIL

(defun view (&optional (width 8) (height 5)) (ppp *automata-grid* :mode :grid :end (list width height)))

(defun set-grid (newvalue) (*set *automata-grid* newvalue))

(defun random-grid () (set-grid (random!! *total-number-of-states*)))

(defun one-step () (if!! (evenp!! *automata-grid*) (floor!! *automata-grid* 2) (*!! (1+!! *automata-grid*) 2)))

(defvar *total-number-of-states* 10)

(defun neumann-count (grid) (+!! (news!! grid 0 -1) ;; north (news!! grid 0 1) ;; south (news!! grid -1 0) ;; west (news!! grid 1 0) ;; east ))

(defun moore-count (grid) (+!! (news!! grid 0 -1) ;; north (news!! grid 0 1) ;; south (news!! grid -1 0) ;; west (news!! grid 1 0) ;; east (news!! grid -1 -1) ;; northwest (news!! grid -1 1) ;; southwest (news!! grid 1 -1) ;; northeast (news!! grid 1 1) ;; southeast ))

(defvar *neighborhood* :neumann)

(defun neighbor-count () (*let ((grid (signum!! *automata-grid*))) (ecase *neighborhood* (:moore (moore-count grid)) (:neumann (neumann-count grid)))))

;; ランダムな値で埋めて、ノイマン方式で隣人の数を勘定してみる (progn (random-grid) (view 8 8) (ppp (neighbor-count) :end '(8 8))) ;>> ;>> DIMENSION 0 (X) -----> ;>> ;>> 5 9 1 0 5 3 5 6 ;>> 3 0 4 5 5 1 2 0 ;>> 9 3 9 2 1 7 7 6 ;>> 7 6 5 2 5 7 1 1 ;>> 3 1 5 5 5 5 7 3 ;>> 0 6 0 6 2 1 2 7 ;>> 3 4 4 5 6 6 2 2 ;>> 0 7 9 1 5 0 6 2 ;>> ;>> DIMENSION 0 (X) -----> ;>> ;>> 4 3 2 3 3 4 4 2 ;>> 3 4 3 3 4 4 3 4 ;>> 4 3 4 4 4 4 4 3 ;>> 4 4 4 4 4 4 4 4 ;>> 3 4 3 4 4 4 4 4 ;>> 4 2 4 3 4 4 4 4 ;>> 2 4 3 4 4 3 4 4 ;>> 3 3 4 4 3 4 3 3 ;>> ;=> NIL

関連

 *Lispのチュートリアルがあるので、過去にこのブログで記事にしてみたりしていましたので、良かったらどうぞ。
ちなみに未だに完結していません…

まとめ

 今回は、Starsimを紹介してみました。
超並列マシンはロマンですね。

clickrの紹介

Posted 2014-05-28 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の149日目です。

clickrとはなにか

 clickrは、Mark Probst氏作のFlickr APIをCommon Lispから利用するユーティリティです。

パッケージ情報

パッケージ名clickr
Quicklisp
参考サイトLisping Flickr | Mostly Software
CLiKihttp://cliki.net/clickr
Quickdocshttp://quickdocs.org/clickr
CL Test Grid: ビルド状況clickr | CL Test Grid

インストール方法

(ql:quickload :clickr)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 利用にあたって、まずflickr.lispの

(defun md5sum-string (string)
  (octets-to-md5-string (md5sum-sequence string)))

がmd5:md5sum-stringを上書きして変なことになっているので、名前を変更します。

(defun string-md5sum-string (string)
  (octets-to-md5-string (md5sum-string string)))

そしてこれを利用している関数も変更

(defun arguments-signature (api-info args)
  (labels ((convert (args)
	     (if (null args)
		 nil
		 (cons (list (symbol-name (car args)) (cadr args)) (convert (cddr args))))))
    (let* ((sorted-args (sort (convert args) #'(lambda (x y) (string< (car x) (car y)))))
	   (args-string (apply #'concatenate 'string
			       (mapcar #'(lambda (a) (concatenate 'string (car a) (cadr a)))
				       sorted-args))))
      (string-md5sum-string (concatenate 'string (flickr-api-info-shared-secret api-info) args-string)))))

多分ロードした後では変なことになってしまうので、変更してからライブラリを読み込み直す必要があると思います。

 clickrを利用する上での注意点ですが、OAuth対応でない古いAPIを利用しているので、そのうち使えなくなる可能性が高いと思われます。とりあえず、現時点では古いAPIでも動くようです。
また、ブラウザを開くプログラムがMac用のopenしか用意されていないので、flickr.lispのurl_handler.shを適当に作成するか変更します。

 全体の構成ですが、基礎的な部分を構成するflickrパッケージと高レベルのAPIのclickrパッケージ、自動化を目的としたautomatrパッケージに分かれています。
下記の例では、ログインしてユーザーの最新の画像を取得してみています。
※FlickrのAPIキーは下記で取得します

(defpackage :myclickr 
  (:use :cl :automatr :flickr :clickr))

(cl:in-package :myclickr)

(defvar *api-key* "...") (defvar *shared-secret* "...") (defvar *my-api-info* nil) (defvar *my-user-name* "...") (defvar *my-user* nil)

(setf *my-api-info* (request-authorization *api-key* *shared-secret*))

(complete-authorization *my-api-info*)

(setf *my-user* (user-with-name *my-api-info* *my-user-name*))

(defvar *api-info* *my-api-info*)

(defvar *me* (user-with-name *api-info* *my-user-name*))

(user-photopage-url *me*) ;=> "http://www.flickr.com/photos/70064901@N00"

(clickr::fetch-user-photosets *me*) ;=> (#<CLICKR::PHOTOSET {1015D6C7D3}> #<CLICKR::PHOTOSET {1015D6EDF3}> ; #<CLICKR::PHOTOSET {1015D6F373}>)

(photo-urls (first (clickr::fetch-user-photos *me*))) ;=> (#S(FLICKR::FLICKR-URL ; :TYPE "photopage" ; :URL "https://www.flickr.com/photos/masso/14101544217/"))

load-flickr.lispに簡単なコード例があるので参考にできるかと思います。

まとめ

 今回は、clickrを紹介してみました。
clickrのgithubでのissueページを眺める限り、今後メンテナンスはする予定がないようなので興味のある方は誰か引き継いでみるのも良いかもしれません〈Pull Reqは歓迎の様子〉。

ECLのext:single-float-negative-infinity

Posted 2014-05-28 14:47:00 GMT

 ECLをいじっていて謎に遭遇したのでメモ。

これはOK

(defun morlis (x)
  (declare (float x))
  (let ((y ext:single-float-negative-infinity))
    (> x y)))

(morlis 3.0) ;=> T (morlis ext:single-float-negative-infinity) ;=> NIL

こっちはNG。コンパイルできない。

(defun lakanito (x)
  (declare (single-float x))
  (let ((y ext:single-float-negative-infinity))
    (> x y)))

;!>1 compiler notes: ;!> ;!>cl-2014-05-25.lisp:204:1: ;!> error: ;!> Internal error: ;!> in file ecl-swank-tmpfile-W9t0gl, position 0 ;!> at (DEFUN LAKANITO ...) ;!> ** #<a ARITHMETIC-ERROR>

ext:single-float-positive-infinityでも同じ。single-floatの筈だけどなあ。

(type-of ext:single-float-positive-infinity)
;=>  SINGLE-FLOAT

(typep ext:single-float-positive-infinity 'single-float)
;=>  T

cl-ansi-textの紹介

Posted 2014-05-28 05:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の148日目です。

cl-ansi-textとはなにか

 cl-ansi-textは、ターミナルのANSIエスケープ・シーケンスを簡便に利用するためのユーティリティです。

パッケージ情報

パッケージ名cl-ansi-text
Quicklisp
Quickdocshttp://quickdocs.org/cl-ansi-text

インストール方法

(ql:quickload :cl-ansi-text)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 使い方はシンプルで、with-colorマクロという構文で囲った範囲が、指定した書式で表示されます。
囲った範囲は、

(let ((colors '(:black :red :green :yellow :blue :magenta :cyan :white)))
  (dolist (c colors (terpri))
    (cl-ansi-text:with-color (c :effect :underline)
      (format t "~S " (gensym)))))
;>>  ^[[30;4m#:G2405 ^[[0m^[[31;4m#:G2406 ^[[0m^[[32;4m#:G2407 ^[[0m^[[33;4m#:G2408 ^[[0m^[[34;4m#:G2409 ^[[0m^[[35;4m#:G2410 ^[[0m^[[36;4m#:G2411 ^[[0m^[[37;4m#:G2412 ^[[0m
;>>  
;=>  NIL

のようにエスケープ・シーケンスが付加されていて、

ansi-esc-seq

のように表示されます〈色付き/下線付き〉

まとめ

 今回は、cl-ansi-textを紹介してみました。
ターミナルを利用するアプリ等では便利に使えそうです。

date-calcの紹介

Posted 2014-05-27 12:10:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の147日目です。

date-calcとはなにか

 date-calcは、PerlのDate::CalcモジュールをCommon Lispへ移植したものです。

パッケージ情報

パッケージ名date-calc
Quicklisp
参考サイト
CLiKihttp://cliki.net/date-calc
Quickdocshttp://quickdocs.org/date-calc

インストール方法

(ql:quickload :date-calc)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 大体Perlのオリジナルと同じAPIが用意されています。

;; 今日の日付を取得
;; perl: ($year, $month, $day) = Today();

(multiple-value-bind (year month day)
                     (date-calc:today)
  (list year month day))
;=>  (2014 5 27)

;; 現在のタイムスタンプを取得(形式:2003-06-12 ) ;; perl: ($year, $month, $day, $hour, $min, $sec) = Today_and_Now(); (multiple-value-bind (year month day hour min sec) (date-calc:today-and-now) (list year month day hour min sec)) ;=> (2014 5 27 20 46 4)

;; 現在の曜日を数字にて取得 ;; perl: $day_of_week = Day_of_Week($year,$month,$day); (date-calc:day-of-week 2014 5 27) ;=> 2

;; 現在の曜日をテキストにて取得 ;; perl: $string_full = Day_of_Week_to_Text($day_of_week); (elt (gethash 1 date-calc::day-of-week-to-text) (date-calc:day-of-week 2014 5 27)) ;; ??? ;=> "Tuesday"

;; 今日の曜日をテキスト(省略形)にて取得 ;; perl: $string_abb = Day_of_Week_Abbreviation($day_of_week); (elt (gethash 1 date-calc::day-of-week-abbreviation) (date-calc:day-of-week 2014 5 27)) ;=> "Tue"

;; 昨日の日付を取得 ;; perl: ($d_year, $d_month, $d_day) = Add_Delta_Days($year, $month, $day, -1); (date-calc:add-delta-days 2014 5 27 -1) ;=> 2014 ; 5 ; 26

;; 一年三ヶ月後の日時を取得 ;; perl: Add_Delta_YM($year, $month, $day,+1,+3); (date-calc:add-delta-ym 2014 5 27 1 3) ;=> 2015 ; 8 ; 27

;; 指定月の日数を取得(月末日の取得) ;; perl: $days = Days_in_Month($year,$month); (date-calc:days-in-month 2014 5) ;=> 31

;; 指定した日付が実在するかどうか確認。実在する場合1を返す(CLではt/nil) ;; perl: check_date(2004, 2, 31); (date-calc:check-date 2004 2 31) ;=> NIL

まとめ

 今回は、date-calcを紹介してみました。
Common Lispだとlocal-timeが良く使われるかなと思いますが、date-calcも結構手軽なので割と自分は使ったりします。

hu.dwim.common-lispの紹介

Posted 2014-05-26 05:45:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の146日目です。

hu.dwim.common-lispとはなにか

 hu.dwim.common-lispは、dwim.huの人達がカスタマイズしているcommon-lispパッケージです。

パッケージ情報

パッケージ名hu.dwim.common-lisp
Quicklisp
CLiKihttp://cliki.net/hu.dwim.common-lisp
Quickdocshttp://quickdocs.org/hu.dwim.common-lisp

インストール方法

(ql:quickload :hu.dwim.common-lisp)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 定義といっても

(defpackage :hu.dwim.common-lisp)

(let ((package (find-package :hu.dwim.common-lisp)) ;; TODO: add get, but is used at several places currently (shadowed-symbols '(set))) (do-external-symbols (symbol (find-package :common-lisp)) (unless (member symbol shadowed-symbols) ;; do take care of the symbol nil: (list nil)! (let ((symbol (or symbol (list nil)))) (import symbol package) (export symbol package)))))

これだけです。
やっていることといえば、setという名前のシンボル以外はCLパッケージからインポートして、エクスポートし直しているという感じです。
:shadowing-import-fromを利用すれば良いのではとも思いますが、何か理由があるのでしょう。

 名前が基盤っぽいので、hu.dwimのパッケージは基本的にこれを使っているのだろうかと思い、ちょっと調べてみましたが、依存しているパッケージは、hu.dwim.walkerと、hu.dwim.reiterate位の様です。

まとめ

 今回は、hu.dwim.common-lispを紹介してみました。
当初は基盤として利用するつもりが、そのままcommon-lispを利用しちゃってた、というところなのでしょうか。

Quicklisp全部入りコアを作ろう

Posted 2014-05-25 12:40:00 GMT

結果

 試してみた結果からいきなり書くと、全部入りコアは無理でした。
同居できたシステムは、1010中719。パッケージにして、1839パッケージ。コアのサイズは、600MiB。
1800パッケージでも、コアのサイズは1GiBに届かず。

 同居できたシステムは下記の通りですが、あと100位は頑張れるかもしれません。

'(:3B-SWF :3BMD :ABLE :ACCESS :ADVANCED-READTABLE :ADW-CHARTING :ALEXANDRIA
  :ALGEBRAIC-DATA-LIBRARY :AMAZON-ECS :ANAPHORA :ANAPHORIC-VARIANTS :ANTIK
  :APPLY-ARGV :ARCHITECTURE.SERVICE-PROVIDER :ARCHIVE :ARNESI :ARRAY-OPERATIONS
  :ASDF-DEPENDENCY-GROVEL :ASDF-ENCODINGS :ASDF-FINALIZERS :ASDF-LINGUIST
  :ASDF-PACKAGE-SYSTEM :ASDF-PROJECT-HELPER :ASDF-SYSTEM-CONNECTIONS
  :ASDF-UTILS :AUTOPROJECT :AYAH-CAPTCHA :BABEL :BASIC-BINARY-IPC :BEIRC
  :BIG-STRING :BINARY-TYPES :BINASCII :BINOMIAL-HEAP :BITFIELD-SCHEMA :BK-TREE
  :BORDEAUX-FFT :BORDEAUX-THREADS :BOURBAKI :BT-SEMAPHORE :BTRIE
  :BUBBLE-OPERATOR-UPWARDS :BUILDAPP :CALISPEL :CAMBL :CARTESIAN-PRODUCT-SWITCH
  :CAVEMAN :CELLS :CFFI :CFFI-OBJECTS :CH-IMAGE :CHANGED-STREAM :CHANL :CHECKL
  :CHEMICAL-COMPOUNDS :CHILLAX :CHIPZ :CHIRP :CHRONICITY :CHUNGA
  :CIRCULAR-STREAMS :CITY-HASH :CL+SSL :CL-6502 :CL-ALGEBRAIC-DATA-TYPE
  :CL-ANNOT :CL-ANONFUN :CL-ANSI-TEXT :CL-APPLE-PLIST :CL-ARFF-PARSER
  :CL-ARROWS :CL-ASYNC-FUTURE :CL-AUTOREPO :CL-AUTOWRAP :CL-AZURE :CL-BASE32
  :CL-BASE58 :CL-BASE64 :CL-BAYESNET :CL-BEANSTALK :CL-BINAURAL :CL-BLOOM
  :CL-BPLUSTREE :CL-BUCHBERGER :CL-CAIRO2 :CL-CASE-CONTROL :CL-CHESHIRE-CAT
  :CL-COLORS :CL-CONT :CL-CONTAINERS :CL-CREDITCARD :CL-CRON :CL-CSS :CL-CTRNN
  :CL-CURLEX :CL-CUSTOM-HASH-TABLE :CL-DATA-FRAME :CL-DATE-TIME-PARSER
  :CL-DIFFLIB :CL-DOT :CL-DROPBOX :CL-DSL :CL-EMACS-IF :CL-EMB :CL-EPOCH
  :CL-EWKB :CL-FACTORING :CL-FAD :CL-FLOWD :CL-FLUIDINFO :CL-FSNOTIFY
  :CL-GAP-BUFFER :CL-GD :CL-GEOMETRY :CL-GITHUB-V3 :CL-GRACE :CL-GRAPH
  :CL-GROWL :CL-HAML :CL-HEAP :CL-HEREDOC :CL-HTML-DIFF :CL-HTML-PARSE
  :CL-HTML5-PARSER :CL-I18N :CL-INFLECTOR :CL-INFLUXDB :CL-INTERPOL :CL-IRC
  :CL-IRREGSEXP :CL-ISAAC :CL-JPEG :CL-JSON :CL-L10N-CLDR :CL-LARVAL :CL-LAUNCH
  :CL-LEDGER :CL-LEX :CL-LOCALE :CL-LOCATIVES :CL-LOG :CL-LTSV :CL-M4
  :CL-MARKDOWN :CL-MARKUP :CL-MEDIAWIKI :CL-MEMCACHED :CL-MESSAGEPACK
  :CL-MIGRATIONS :CL-MIME :CL-MONAD-MACROS :CL-MONERIS :CL-MONGO :CL-MONGO-ID
  :CL-MURMURHASH :CL-MUSTACHE :CL-NCURSES :CL-NEO4J :CL-NETSTRINGS :CL-NTRIPLES
  :CL-NUM-UTILS :CL-OAUTH :CL-OLEFS :CL-ONE-TIME-PASSWORDS :CL-OP :CL-OPENAL
  :CL-OPENID :CL-OPENSTACK :CL-ORG-MODE :CL-PACKAGE-LOCKS :CL-PARALLEL
  :CL-PAYMILL :CL-PAYPAL :CL-PDF :CL-PERFORMANCE-TUNING-HELPER :CL-PERMUTATION
  :CL-PHOTO :CL-PLUMBING :CL-PLY :CL-POP :CL-PORTAUDIO :CL-PPCRE :CL-PREVALENCE
  :CL-PRIMALITY :CL-QUICKCHECK :CL-RANDIST :CL-RDFXML :CL-READ-MACRO-TOKENS
  :CL-RECAPTCHA :CL-REDIS :CL-RFC2047 :CL-RRT :CL-RSVG2 :CL-S3 :CL-SAM :CL-SASL
  :CL-SCRIBD :CL-SCROBBLER :CL-SECURE-READ :CL-SENTIMENT :CL-SERVER-MANAGER
  :CL-SIMPLE-TABLE :CL-SKIP-LIST :CL-SLICE :CL-SMTP :CL-SPARK :CL-SPEEDY-QUEUE
  :CL-SPLICING-MACRO :CL-STM :CL-STOMP :CL-STOPWATCH :CL-STORE
  :CL-STRING-COMPLETE :CL-STRING-MATCH :CL-SVM :CL-SYNTAX :CL-SYSLOG :CL-TABLE
  :CL-TEMPLATE :CL-TEST-MORE :CL-TK :CL-TULIP-GRAPH :CL-TUPLES :CL-TWITTER
  :CL-TYPESETTING :CL-UNICODE :CL-UNIFICATION :CL-UTILITIES :CL-VECTORS
  :CL-WEB-CRAWLER :CL-WEBDAV :CL-WHO :CL-XMLSPAM :CL-XMPP :CLACHE :CLACK
  :CLACK-ERRORS :CLAWK :CLAZY :CLEM :CLERIC :CLESH :CLFSWM :CLHS :CLIMACS
  :CLIMC :CLITE :CLOBBER :CLON :CLOS-DIFF :CLOSER-MOP :CLOSURE-COMMON :CLOUCHDB
  :CLSQL :CLSQL-FLUID :CLSQL-HELPER :CLSQL-ORM :CLUNIT :CLX :CLX-CURSOR
  :CLX-TRUETYPE :CODATA-RECOMMENDED-VALUES :COLLECTORS :COLORIZE
  :COM.CLEARLY-USEFUL.GENERIC-COLLECTION-INTERFACE
  :COM.CLEARLY-USEFUL.ITERATOR-PROTOCOL :COM.CLEARLY-USEFUL.PROTOCOLS
  :COM.GOOGLE.BASE :COMMAND-LINE-ARGUMENTS :COMPUTABLE-REALS :CONDUIT-PACKAGES
  :CONIUM :CONTEXTL :CRANE :CSS-LITE :CSV-PARSER :CURLY
  :CURRY-COMPOSE-READER-MACROS :DAEMON :DATA-SIFT :DATA-TABLE :DATAFLY
  :DATE-CALC :DEFINE-JSON-EXPANDER :DEFLATE :DEFMACRO-ENHANCE :DEFMEMO :DEFREC
  :DEFSTAR :DEFSYSTEM-COMPATIBILITY :DEFVARIANT :DELOREAN :DELTA-DEBUG
  :DEOXYBYTE-GZIP :DEOXYBYTE-IO :DEOXYBYTE-SYSTEMS :DEOXYBYTE-UNIX
  :DEOXYBYTE-UTILITIES :DIFF :DJULA :DLIST :DO-URLENCODE :DOCBROWSER
  :DOCUMENTATION-TEMPLATE :DONUTS :DOPLUS :DRAKMA :DRAW-CONS-TREE :DSO-LEX
  :DSO-UTIL :DYNAMIC-CLASSES :DYNAMIC-COLLECT :EAGER-FUTURE :EAGER-FUTURE2 :EC2
  :ELEPHANT :ELF :ENHANCED-EVAL-WHEN :ENHANCED-MULTIPLE-VALUE-BIND :ENVY :EOS
  :ERNESTINE :ESCALATOR :ESRAP :ESRAP-PEG :EVOL :EXTENDED-REALS
  :EXTERNAL-PROGRAM :F-UNDERSCORE :F2CL :FARE-CSV :FARE-MEMOIZATION :FARE-MOP
  :FARE-UTILS :FAST-IO :FEMLISP :FFA :FFT :FILTERED-FUNCTIONS :FIREPHP :FIVEAM
  :FLEXI-STREAMS :FLEXICHAIN :FLOATING-POINT :FOLIO :FOMUS :FORMLETS
  :FS-WATCHER :FSET :FSVD :FUNCTION-CACHE :GARBAGE-POOLS :GBBOPEN :GENERATORS
  :GENERIC-SEQUENCES :GETOPT :GETTEXT :GLOP :GLU-TESSELLATE :GORDON :GRAPH
  :GRAYLEX :GREEN-THREADS :GROUP-BY :GTFL :GZIP-STREAM :HERMETIC :HH-REDBLACK
  :HH-WEB :HT-SIMPLE-AJAX :HTML-ENCODE :HTML-ENTITIES :HTML-TEMPLATE
  :HTTP-PARSE :HU.DWIM.ASDF :HU.DWIM.COMMON :HU.DWIM.COMMON-LISP :HU.DWIM.DEF
  :HU.DWIM.DEFCLASS-STAR :HU.DWIM.STEFIL :HU.DWIM.SYNTAX-SUGAR :HUNCHENTOOT
  :HUNCHENTOOT-AUTH :HUNCHENTOOT-CGI :HYPEROBJECT :IDNA :IE3FP :IEEE-FLOATS
  :IMAGO :INCF-CL :INCOGNITO-KEYWORDS :INCONGRUENT-METHODS :INFIX-DOLLAR-READER
  :INTEGRAL :INTERCOM :IP-INTERFACES :IRC-LOGGER :IRONCLAD :ITERATE
  :ITERATE-CLSQL :JPL-QUEUES :JSOWN :JWACS :KM :KMRCL :L-MATH :LAMBDA-READER
  :LASSIE :LATEX-TABLE :LET-PLUS :LETREC :LEVENSHTEIN :LHSTATS :LIFT :LINEDIT
  :LISA :LISP-EXECUTABLE :LISP-INTERFACE-LIBRARY :LISP-UNIT :LISP-UNIT2
  :LISTOFLIST :LLA :LML :LML2 :LOCAL-PACKAGE-ALIASES :LOCAL-TIME :LOG4CL :LOG5
  :LOWLIGHT :LPARALLEL :LTK :LW-COMPAT :MACRO-LEVEL :MACROEXPAND-DAMMIT
  :MADEIRA-PORT :MAILBOX :MAKE-HASH :MANARDB :MANIFEST :MAP-BIND :MAP-SET
  :MARCHING-CUBES :MARSHAL :MCCLIM :MD5 :MEMOIZE :MESSAGE-OO :META :META-SEXP
  :METABANG-BIND :METACOPY :METATILITIES :METATILITIES-BASE
  :METHOD-COMBINATION-UTILITIES :METHOD-VERSIONS :MGL :MICMAC :MIDI :MINHEAP
  :MINI-CAS :MISC-EXTENSIONS :MIXALOT :MODF :MODF-FSET :MONKEYLIB-HTML
  :MONKEYLIB-MARKUP-HTML :MONKEYLIB-TEXT-LANGUAGES :MONKEYLIB-TEXT-OUTPUT
  :MONTEZUMA :MOP-UTILS :MOPTILITIES :MORE-CONDITIONS :MT19937 :MTLISP
  :MULTIPLE-VALUE-VARIANTS :MULTIVAL-PLIST :MW-EQUIV :MYWEB :NAMED-READTABLES
  :NAPA-FFT3 :NEKTHUTH :NET-TELENT-DATE :NET4CL :NEW-OP :NIBBLES :NINGLE :NPG
  :NST :NUCLBLOG :ODD-STREAMS :ODS4CL :OPEN-VRP :OPTICL :OPTIMA :ORG-DAVEP-DICT
  :ORG-DAVEP-DICTREPL :OSC :OSICAT :PACK :PACKAGE-RENAMING :PACKET :PAIPROLOG
  :PAREN-FILES :PARENSCRIPT :PARENSCRIPT-CLASSIC :PARSE-FLOAT :PARSE-JS
  :PARSE-NUMBER :PARSE-NUMBER-RANGE :PARSELTONGUE :PATRON :PCALL
  :PERCENT-ENCODING :PERIODIC-TABLE :PERIODS :PERSISTENT-TABLES
  :PERSISTENT-VARIABLES :PETIT.PACKAGE-UTILS :PETTOMATO-DEQUE
  :PETTOMATO-INDEXED-PRIORITY-QUEUE :PG :PILEUP :PIPES :PIPING :PITHY-XML
  :PLACE-MODIFIERS :PLACE-UTILS :PLANKS :PLUMP :PNG-READ :POLICY-COND :POOLER
  :POSITIONAL-LAMBDA :POSTMODERN :POSTOFFICE :PREPL :PRETTY-FUNCTION
  :PRIORITY-QUEUE :PROTOBUF :PSGRAPH :PTESTER :PURI :PY-CONFIGPARSER
  :PY-CONFIGVALIDATOR :PYTHONIC-STRING-READER :QBOOK :QMYND :QUEUES
  :QUICKLISP-SLIME-HELPER :QUICKPROJECT :QUICKSEARCH :QUICKUTIL :QUID-PRO-QUO
  :QUUX-TIME :RANDOM :RANDOM-ACCESS-LISTS :READABLE :READER-INTERCEPTION
  :RECTANGLE-PACKING :RECUR :RECURSIVE-REGEX :RED-BLACK :REGEX :REPL-UTILITIES
  :RESTAS :RESTAS-DIRECTORY-PUBLISHER :RESTAS.FILE-PUBLISHER :RETROSPECTIFF
  :REVERSI :RFC2109 :RFC2388 :RFC2388-BINARY :RFC3339-TIMESTAMP :RLC :ROMREADER
  :RPC4CL :RT :RUCKSACK :RUTILS :S-BASE64 :S-DOT :S-HTTP-CLIENT :S-HTTP-SERVER
  :S-SYSDEPS :S-UTILS :S-XML :S-XML-RPC :SALZA2 :SAPACLISP :SB-CGA :SB-FASTCGI
  :SB-VECTOR-IO :SCREAMER :SECRET-VALUES :SECURE-RANDOM :SEQUENCE-ITERATORS
  :SERIES :SEXML :SHA3 :SHADCHEN :SHEEPLE :SHELLY :SIMPLE-CURRENCY
  :SIMPLE-DATE-TIME :SIMPLE-FINALIZER :SIMPLE-RGB :SIMPSAMP
  :SINGLE-THREADED-CCL :SIP-HASH :SKIPPY :SMACKJACK :SNAPPY :SNMP :SOUNDEX
  :SPARTNS :SPATIAL-TREES :SPELLCHECK :SPINNERET :SPLIT-SEQUENCE :ST-JSON
  :STATIC-VECTORS :STEFIL :STEM :STMX :STRING-CASE :STRINGPREP
  :STUMP-TOUCHY-MODE-LINE :STUMPWM :SUBMARINE :SWANK-CLIENT :SWANK-CREW
  :SWAP-BYTES :SXQL :SYMBOL-MUNGER :SYMBOL-NAMESPACES :SYNONYMS :TAGGER :TALCL
  :TAP-UNIT-TEST :TELNETLIB :TEMPORARY-FILE :TESTBILD :TEXT-QUERY :THREAD-POOL
  :THREAD.COMM.RENDEZVOUS :TIME-INTERVAL :TINAA :TOADSTOOL :TOOT :TORTA
  :TRACK-BEST :TREEDB :TREES :TRIVIAL-BACKTRACE :TRIVIAL-BIT-STREAMS
  :TRIVIAL-CHANNELS :TRIVIAL-DOWNLOAD :TRIVIAL-DUMP-CORE :TRIVIAL-FEATURES
  :TRIVIAL-GARBAGE :TRIVIAL-GRAY-STREAMS :TRIVIAL-HTTP :TRIVIAL-IRC
  :TRIVIAL-LAZY :TRIVIAL-LDAP :TRIVIAL-OCTET-STREAMS :TRIVIAL-RAW-IO
  :TRIVIAL-SHELL :TRIVIAL-TCO :TRIVIAL-TIMEOUT :TRIVIAL-TIMERS :TRIVIAL-TYPES
  :TRIVIAL-UTF-8 :UCW :UFFI :UIOP :UMLISP-ORF :UNICLY :UNIT-TEST :UNIX-OPTIONS
  :URI-TEMPLATE :URL-REWRITE :USERIAL :USOCKET :USOCKET-UDP
  :UTILITIES.PRINT-ITEMS :UTILS-KT :UUID :VAS-STRING-METRICS :VECTO :VERBOSE
  :VERRAZANO :VGPLOT :WEBLOCKS-STORES :WU-DECIMAL :WUWEI :X.FDATATYPES
  :X.LET-STAR :XARRAY :XHTMLGEN :XLUNIT :XML-EMITTER :XML-MOP :XML.LOCATION
  :XMLS :XMLS-TOOLS :XPTEST :YACLANAPHT :YACLML :YASON :ZAWS :ZCDB :ZIP :ZLIB
  :ZPB-EXIF :ZPB-TTF :ZPNG :ZS3 :ZSORT)

大量のパッケージが読み込まれているコアを利用するメリット/デメリット

メリット

 メリットは以前このブログでも書いたことがありますが、ライブラリを探すのが楽だったりします。

デメリット

 デメリットですが、SLIMEでシンボルを補完するのが重くなります。
また、大きいコアをロードするので起動も重くなります。
そして、デバッグ時等に行儀の悪いパッケージがやらかした潜在的な問題に遭遇して、意味が分からないなあ、なんだこれ、ということになりがちです。

巨大なコアを作る場合に遭遇する問題

 大量にシステムを読み込む場合に問題になるところですが、

  • パッケージ名の競合
  • リードテーブルの破壊

あたりが多いようです。

パッケージ名の競合

 近頃はどうもパッケージ名の競合が以前より激しくなって来ている気がします。マークアップ系のもので'<'パッケージが3つ位あったり。

リードテーブルの破壊

 リードテーブルの破壊は、cxml系が多いようです。
どうも一連のcxmlパッケージはリードテーブルを定義せずに大域的に定義してしまうので、基本的に変なことになっているのはこの人達のせいな気がします。汚染しないようにして欲しいところ。
dwim.hu関係、cl-yacc系もおかしいかも。

知らぬ間にスレッドが生成されている

 ロードするとスレッドを生成するライブラリがあります。
SBCL等ではイメージのダンプはメインスレッドだけの状態でする必要があるので、メイン以外を全部殺す必要があります。
大抵こういうライブラリは、ロードした時に環境を整えているようなので、イメージにダンプするのとは相性が悪いかもしれません。

今回の謎エラー

謎の定数宣言

 read-csv が

(defconstant quote 3)

とかしている所為で

(defun code-walker (quote)
  ....)

(let ((quote 8)) quote)

的な他のライブラリのコードが皆コケる事態に。
一応解説しておくと、定数宣言してしまうと束縛はできなくなるのでこんなことになります。
処理系がエラーを出さないのも問題かなとは思いますが。
CLパッケージのシンボルはいじらないようにしましょう〈適切にshadowしましょう〉。
ちなみに検出ですが、

(let ((quote 42)) quote)

のようなコードをロードの度に評価しておけば良いので比較的犯人探しは簡単でした。

イメージがダンプできない

 これは原因が不明でしたが、gcを何回か掛けてからダンプするようにしたらダンプできるようでした。なんでしょう。ffi関係な気はしています。

まとめ

 たまに変なことをしてみるのも色々勉強になります。

cl-skip-listの紹介

Posted 2014-05-24 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の145日目です。

cl-skip-listとはなにか

 cl-skip-listは、Kevin Thomas Raison氏作のCommon Lisp用スキップリストのライブラリです。

パッケージ情報

パッケージ名cl-skip-list
Quicklisp
CLiKihttp://cliki.net/cl-skip-list
Quickdocshttp://quickdocs.org/cl-skip-list

インストール方法

(ql:quickload :cl-skip-list)

試してみる

 どんな関数があるかは、Quickdocsで確認できます〈多分〉

 大半の操作について平均O(log n)のリストということなので、いつものように普通のリストとランダムアクセス性能を比べてみます。

(defun shuffle-list (list &aux (len (length list)))
  (mapl (lambda (u)
          (rotatef (first u) (nth (random len) list)))
        list)
  list)

(defun sl-iota (count &optional (start 0) (step 1)) (declare (fixnum count) (number start step) (optimize (debug 1))) (let ((sl (cl-skip-list:make-skip-list))) (loop :for i :from start :by step :repeat count :do (skip-list-add sl i i)) sl))

(defun sl-shuffle-list (sl) (let ((len (skip-list-length sl)) (ans sl)) (dotimes (idx len ans) (let* ((rand (random len)) (elt1 (skip-list-lookup sl idx)) (elt2 (skip-list-lookup sl rand))) (skip-list-replace-kv sl idx elt2) (skip-list-replace-kv sl rand elt1))) ans))

(let ((sl (sl-shuffle-list (sl-iota 100)))) (loop :with cur := (skip-list-values-cursor sl) :for v := (sl-cursor-next cur) :while v :collect v)) ;=> (94 89 9 20 41 32 61 95 18 64 68 97 21 1 4 28 60 37 91 30 44 84 2 45 13 10 51 ; 83 65 85 11 40 92 90 12 22 50 66 96 78 86 74 63 71 19 88 31 16 0 49 25 55 15 ; 99 87 79 81 70 77 76 82 8 38 72 98 67 17 39 34 26 14 54 7 27 43 24 80 36 75 73 ; 3 29 62 6 58 5 56 53 23 52 35 42 47 59 48 69 33 46 57 93)

こんな感じのものを定義して計測します。

計測/比較

(defvar *list* (*:iota 100000))

(progn (shuffle-list *list*) nil) ;=> NIL #|------------------------------------------------------------| Evaluation took: 11.173 seconds of real time 11.364000 seconds of total run time (11.364000 user, 0.000000 system) 101.71% CPU 36,785,033,479 processor cycles 219,712 bytes consed

Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz |------------------------------------------------------------|#

(defvar *sl-list* (sl-iota 100000))

(progn (sl-shuffle-list *sl-list*) nil) ;=> NIL #|------------------------------------------------------------| Evaluation took: 0.858 seconds of real time 0.816000 seconds of total run time (0.816000 user, 0.000000 system) 95.10% CPU 2,824,862,635 processor cycles 217,578,528 bytes consed

Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz |------------------------------------------------------------|#

通常のリストよりは大分速いことが分かります。

まとめ

 今回は、cl-skip-listを紹介してみました。
データ構造の紹介は、適切な例を探すのが面倒です。

iotaの紹介

Posted 2014-05-24 04:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の144日目です。

iotaとはなにか

 iotaは、Kent Pitman氏作のMacLISPの入出力系のマクロのユーティリティです。

パッケージ情報

インストール方法

 MacLISPのソースを拾ってくるとIOTA.LSPがあるので、それを適当に利用します。
Common Lispに移植してみたものがありますので、良かったらどうぞ。

試してみる

 ITSでは、LIBDOCの下に置いてあります。ファイルのタイムスタンプを確認すると

IOTA KMP1 2 3/16/1981 15:45:51
となっているので1981年頃の物のようです。

IOTA

 IOTAは、I/Oに由来。こんな感じで利用できます〈コード例はCommon Lisp〉

(defun filecopy (from to)
  (iota ((foo from
              :direction :input 
              :element-type '(unsigned-byte 8))
         (bar to
              :direction :output 
              :element-type '(unsigned-byte 8)
              :if-exists :supersede
              :if-does-not-exist :create))
    (do ((c (read-byte foo nil -1) (read-byte foo nil -1)))
        ((minusp c))
      (write-byte c bar))))

大体CL:WITH-OPEN-FILEのような物ですが、フォームの形式がLET的になっていて、複数のストリームを扱えるのが特長です。

PHI

 PHIは、PHIle/FILEに由来。IOTAがCL:WITH-OPEN-FILEとすれば、CL:WITH-OPEN-STREAMみたいなものです。

(defun filecopy (from to)
  (phi ((foo (open from 
                   :direction :input
                   :element-type '(unsigned-byte 8)))
        (bar (open to 
                   :direction :output 
                   :element-type '(unsigned-byte 8)
                   :if-exists :supersede
                   :if-does-not-exist :create)))
       (do ((c (read-byte foo nil -1) (read-byte foo nil -1)))
           ((minusp c))
         (write-byte c bar))))

PI

 PIは、Program Interruptsに由来。WITHOUT-INTERRUPTS〈Common Lisp標準にはなし〉に展開されます。

(pi (do-some-io-thing)) ==>
(SB-SYS:WITHOUT-INTERRUPTS
  (DO-SOME-IO-THING))

まとめ

 今回は、iotaを紹介してみました。
CL:WITH-OPEN-FILEを入出力でネストすることは割合にあるのですが、そういう場合に便利そうです。

preplの紹介

Posted 2014-05-23 09:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の143日目です。

preplとはなにか

 preplは、David Lichteblau氏作のポータブルなREPLです。

パッケージ情報

パッケージ名prepl
Quicklisp
CLiKihttp://cliki.net/prepl
Quickdocshttp://quickdocs.org/prepl

インストール方法

(ql:quickload :prepl)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 元は、SBCLに付属のSB-ACLREPLをポータブルにしたものとのこと。
SB-ACLREPLは、そもそもAllegro CLのREPLを真似したいということからできているので、preplは結局ポータブルなAllegro CLのREPLというところです。
利用できるコマンドは、Allegro CL風に

COMMAND          DESCRIPTION
<n>              re-execute <n>th history command
abort            Invoke ABORT restart.
aliases          show aliases
apropos          show apropos
bottom           move to bottom stack frame
bt               backtrace `n' stack frames, default all
cd               change default directory
cf               compile file
cload            compile if needed and load file
continue         continue from a continuable error
current          print the expression for the current stack frame
describe         describe an object
dirs             show directory stack
dn               NIL
error            print the last error message
exit             exit lisp
frame            print info about the current frame
help             print this help
history          print the recent history
inspect          inspect an object
istep            navigate within inspection of a lisp object
kill             kill (destroy) processes
ld               load a file
load-op          Load the specified ASDF system
load-system      Alias for load-op
local            print the value of a local variable
macroexpand      macroexpand an expression
make             Alias for load-op
package          change current package
pop              pop up `n' (default 1) break levels
popd             pop directory from stack
processes        NIL
pushd            push directory on stack
pwd              print current directory
readtable        change current readtable
reset            reset to top break level
top              move to top stack frame
trace            trace a function
untrace          untrace a function
up               NIL
zoom             print the runtime stack

といったところ。

動作

 簡単なところで本家Allegro CL 9.0(Express)と動作を比べてみます。

Allegro CL

まずは本家から。やっていることですが、

  1. Xを打ち込んで評価。未束縛なのでエラー。
    3回ネストし、一階層づつ戻る(:popコマンド)
  2. Xを打ち込んで評価。未束縛なのでエラー。
    2回ネストし、トップまで一気に抜ける(:resコマンド)
  3. Xを打ち込んで評価。未束縛なのでエラー。
    2回ネストし、バックトレース(:btコマンド)
    その後、バックトレース詳細表示(:zoomコマンド)

です。

CL-USER(1): x
Error: Attempt to take the value of the unbound variable `X'.
  [condition type: UNBOUND-VARIABLE]

Restart actions (select using :continue): 0: Try evaluating X again. 1: Use :X instead. 2: Set the symbol-value of X and use its value. 3: Use a value without setting X. 4: Return to Top Level (an "abort" restart). 5: Abort entirely from this (lisp) process. [1] CL-USER(2): x Error: Attempt to take the value of the unbound variable `X'. [condition type: UNBOUND-VARIABLE]

Restart actions (select using :continue): 0: Try evaluating X again. 1: Use :X instead. 2: Set the symbol-value of X and use its value. 3: Use a value without setting X. 4: Return to Debug Level 1 (an "abort" restart). 5: Try evaluating X again. 6: Use :X instead. 7: Set the symbol-value of X and use its value. 8: Use a value without setting X. 9: Return to Top Level (an "abort" restart). 10: Abort entirely from this (lisp) process. [2] CL-USER(3): x Error: Attempt to take the value of the unbound variable `X'. [condition type: UNBOUND-VARIABLE]

Restart actions (select using :continue): 0: Try evaluating X again. 1: Use :X instead. 2: Set the symbol-value of X and use its value. 3: Use a value without setting X. 4: Return to Debug Level 2 (an "abort" restart). 5: Try evaluating X again. 6: Use :X instead. 7: Set the symbol-value of X and use its value. 8: Use a value without setting X. 9: Return to Debug Level 1 (an "abort" restart). 10: Try evaluating X again. 11: Use :X instead. 12: Set the symbol-value of X and use its value. 13: Use a value without setting X. 14: Return to Top Level (an "abort" restart). 15: Abort entirely from this (lisp) process. [3] CL-USER(4): :pop Previous error: Attempt to take the value of the unbound variable `X'. [2] CL-USER(5): :pop Previous error: Attempt to take the value of the unbound variable `X'. [1] CL-USER(6): :pop CL-USER(7): x Error: Attempt to take the value of the unbound variable `X'. [condition type: UNBOUND-VARIABLE]

Restart actions (select using :continue): 0: Try evaluating X again. 1: Use :X instead. 2: Set the symbol-value of X and use its value. 3: Use a value without setting X. 4: Return to Top Level (an "abort" restart). 5: Abort entirely from this (lisp) process. [1] CL-USER(8): x Error: Attempt to take the value of the unbound variable `X'. [condition type: UNBOUND-VARIABLE]

Restart actions (select using :continue): 0: Try evaluating X again. 1: Use :X instead. 2: Set the symbol-value of X and use its value. 3: Use a value without setting X. 4: Return to Debug Level 1 (an "abort" restart). 5: Try evaluating X again. 6: Use :X instead. 7: Set the symbol-value of X and use its value. 8: Use a value without setting X. 9: Return to Top Level (an "abort" restart). 10: Abort entirely from this (lisp) process. [2] CL-USER(9): :res CL-USER(10): x Error: Attempt to take the value of the unbound variable `X'. [condition type: UNBOUND-VARIABLE]

Restart actions (select using :continue): 0: Try evaluating X again. 1: Use :X instead. 2: Set the symbol-value of X and use its value. 3: Use a value without setting X. 4: Return to Top Level (an "abort" restart). 5: Abort entirely from this (lisp) process. [1] CL-USER(11): x Error: Attempt to take the value of the unbound variable `X'. [condition type: UNBOUND-VARIABLE]

Restart actions (select using :continue): 0: Try evaluating X again. 1: Use :X instead. 2: Set the symbol-value of X and use its value. 3: Use a value without setting X. 4: Return to Debug Level 1 (an "abort" restart). 5: Try evaluating X again. 6: Use :X instead. 7: Set the symbol-value of X and use its value. 8: Use a value without setting X. 9: Return to Top Level (an "abort" restart). 10: Abort entirely from this (lisp) process. [2] CL-USER(12): :bt Evaluation stack:

EVAL <- ERROR <- EVAL <- TPL:TOP-LEVEL-READ-EVAL-PRINT-LOOP <- TPL:START-INTERACTIVE-TOP-LEVEL

[2] CL-USER(13): :zo Evaluation stack:

(ERROR #<UNBOUND-VARIABLE @ #x208f8bfa>) ->(EVAL X) (ERROR #<UNBOUND-VARIABLE @ #x208f818a>) (EVAL X) (TPL:TOP-LEVEL-READ-EVAL-PRINT-LOOP) (TPL:START-INTERACTIVE-TOP-LEVEL #<TERMINAL-SIMPLE-STREAM [initial terminal io] fd 0/1 @ #x201499e2> #<Function TOP-LEVEL-READ-EVAL-PRINT-LOOP> ...) [2] CL-USER(14): :exit ; Exiting

SBCL/Clozure CLでprepl

 次にSBCLとClozure。
Allegro CLとは微妙にコマンドの名前が異なり、:pop -> :abortだったりしますが同じく

  1. Xを打ち込んで評価。未束縛なのでエラー。
    3回ネストし、一階層づつ戻る(:abortコマンド)
  2. Xを打ち込んで評価。未束縛なのでエラー。
    2回ネストし、トップまで一気に抜ける(:resコマンド)
  3. Xを打ち込んで評価。未束縛なのでエラー。
    2回ネストし、バックトレース(:btコマンド)
    その後、バックトレース詳細表示(:zoomコマンド)

です。
バックトレースとzoomはちょっと何が起こっているか判断するには厳しいかなというところ

Clozure CL

Portable REPL on Clozure Common Lisp, listener.  Type :help for help.
CL-USER> x
Debugger entered for condition: #<UNBOUND-VARIABLE #x3020011DDDCD>:
  Unbound variable: X
Available restarts:
   0 [CONTINUE]               Retry getting the value of X.
   1 [USE-VALUE]              Specify a value of X to use this time.
   2 [STORE-VALUE]            Specify a value of X to store and use.
   3 [ABORT]                  Reduce debugger level (to debug level 0).
   4                          Abort to REPL
   5 [ABORT-TO-OUTMOST-REPL]  Abort to outmost REPL
   6                          Return to toplevel.
   7 [ABORT-BREAK]            #<RESTART ABORT-BREAK #x7FFFF7F665AD>
   8                          Reset this thread
   9                          Kill this thread
[1] CL-USER> x
Debugger entered for condition: #<UNBOUND-VARIABLE #x3020011D912D>:
  Unbound variable: X
Available restarts:
   0 [CONTINUE]               Retry getting the value of X.
   1 [USE-VALUE]              Specify a value of X to use this time.
   2 [STORE-VALUE]            Specify a value of X to store and use.
   3 [ABORT]                  Reduce debugger level (to debug level 1).
   4                          Retry getting the value of X.
   5                          Specify a value of X to use this time.
   6                          Specify a value of X to store and use.
   7                          Reduce debugger level (to debug level 0).
   8                          Abort to REPL
   9 [ABORT-TO-OUTMOST-REPL]  Abort to outmost REPL
  10                          Return to toplevel.
  11 [ABORT-BREAK]            #<RESTART ABORT-BREAK #x7FFFF7F665AD>
  12                          Reset this thread
  13                          Kill this thread
[2] CL-USER> x
Debugger entered for condition: #<UNBOUND-VARIABLE #x3020011D444D>:
  Unbound variable: X
Available restarts:
   0 [CONTINUE]               Retry getting the value of X.
   1 [USE-VALUE]              Specify a value of X to use this time.
   2 [STORE-VALUE]            Specify a value of X to store and use.
   3 [ABORT]                  Reduce debugger level (to debug level 2).
   4                          Retry getting the value of X.
   5                          Specify a value of X to use this time.
   6                          Specify a value of X to store and use.
   7                          Reduce debugger level (to debug level 1).
   8                          Retry getting the value of X.
   9                          Specify a value of X to use this time.
  10                          Specify a value of X to store and use.
  11                          Reduce debugger level (to debug level 0).
  12                          Abort to REPL
  13 [ABORT-TO-OUTMOST-REPL]  Abort to outmost REPL
  14                          Return to toplevel.
  15 [ABORT-BREAK]            #<RESTART ABORT-BREAK #x7FFFF7F665AD>
  16                          Reset this thread
  17                          Kill this thread
[3] CL-USER> :ab
[2] CL-USER> :ab
[1] CL-USER> :ab
CL-USER> x
Debugger entered for condition: #<UNBOUND-VARIABLE #x3020011CB60D>:
  Unbound variable: X
Available restarts:
   0 [CONTINUE]               Retry getting the value of X.
   1 [USE-VALUE]              Specify a value of X to use this time.
   2 [STORE-VALUE]            Specify a value of X to store and use.
   3 [ABORT]                  Reduce debugger level (to debug level 0).
   4                          Abort to REPL
   5 [ABORT-TO-OUTMOST-REPL]  Abort to outmost REPL
   6                          Return to toplevel.
   7 [ABORT-BREAK]            #<RESTART ABORT-BREAK #x7FFFF7F665AD>
   8                          Reset this thread
   9                          Kill this thread
[1] CL-USER> x
Debugger entered for condition: #<UNBOUND-VARIABLE #x3020011C7E0D>:
  Unbound variable: X
Available restarts:
   0 [CONTINUE]               Retry getting the value of X.
   1 [USE-VALUE]              Specify a value of X to use this time.
   2 [STORE-VALUE]            Specify a value of X to store and use.
   3 [ABORT]                  Reduce debugger level (to debug level 1).
   4                          Retry getting the value of X.
   5                          Specify a value of X to use this time.
   6                          Specify a value of X to store and use.
   7                          Reduce debugger level (to debug level 0).
   8                          Abort to REPL
   9 [ABORT-TO-OUTMOST-REPL]  Abort to outmost REPL
  10                          Return to toplevel.
  11 [ABORT-BREAK]            #<RESTART ABORT-BREAK #x7FFFF7F665AD>
  12                          Reset this thread
  13                          Kill this thread
[2] CL-USER> :res
CL-USER> x
Debugger entered for condition: #<UNBOUND-VARIABLE #x3020011C287D>:
  Unbound variable: X
Available restarts:
   0 [CONTINUE]               Retry getting the value of X.
   1 [USE-VALUE]              Specify a value of X to use this time.
   2 [STORE-VALUE]            Specify a value of X to store and use.
   3 [ABORT]                  Reduce debugger level (to debug level 0).
   4                          Abort to REPL
   5 [ABORT-TO-OUTMOST-REPL]  Abort to outmost REPL
   6                          Return to toplevel.
   7 [ABORT-BREAK]            #<RESTART ABORT-BREAK #x7FFFF7F665AD>
   8                          Reset this thread
   9                          Kill this thread
[1] CL-USER> x
Debugger entered for condition: #<UNBOUND-VARIABLE #x3020011BF07D>:
  Unbound variable: X
Available restarts:
   0 [CONTINUE]               Retry getting the value of X.
   1 [USE-VALUE]              Specify a value of X to use this time.
   2 [STORE-VALUE]            Specify a value of X to store and use.
   3 [ABORT]                  Reduce debugger level (to debug level 1).
   4                          Retry getting the value of X.
   5                          Specify a value of X to use this time.
   6                          Specify a value of X to store and use.
   7                          Reduce debugger level (to debug level 0).
   8                          Abort to REPL
   9 [ABORT-TO-OUTMOST-REPL]  Abort to outmost REPL
  10                          Return to toplevel.
  11 [ABORT-BREAK]            #<RESTART ABORT-BREAK #x7FFFF7F665AD>
  12                          Reset this thread
  13                          Kill this thread
[2] CL-USER> :bt
(PREPL::%REP-ONE)
(PREPL::REP-ONE)
(PREPL::%REPL :BREAK-LEVEL 2 :NOPRINT NIL :INSPECT NIL :CONTINUABLE NIL :NOBANNER T)
(#<Anonymous Function #x3020010F369F> #<Compiled-function PREPL:DEBUGGER #x30200118929F> #<COMPILED-LEXICAL-CLOSURE (:INTERNAL PREPL:REPL) #x3020011BA93F>)
(PREPL:REPL)
(#<Anonymous Function #x3020010F3A2F> #<COMPILED-LEXICAL-CLOSURE (:INTERNAL PREPL::CONT PREPL:DEBUGGER) #x3020011BA97F>)
(PREPL:DEBUGGER #<UNBOUND-VARIABLE #x3020011BF07D> #<Compiled-function PREPL:DEBUGGER #x30200118929F> NIL)
(CCL::BREAK-LOOP-HANDLE-ERROR #<UNBOUND-VARIABLE #x3020011BF07D> 17592100104127)
(CCL::%ERROR #<UNBOUND-VARIABLE #x3020011BF07D> NIL 17592100104127)
(CCL::%DEFAULT-UNBOUND-VARIABLE-RESTARTS 17592100104127 X)
(CCL::CHEAP-EVAL X)
(PREPL::INTERACTIVE-EVAL X)
(PREPL::%REP-ONE)
(PREPL::REP-ONE)
(PREPL::%REPL :BREAK-LEVEL 1 :NOPRINT NIL :INSPECT NIL :CONTINUABLE NIL :NOBANNER T)
(#<Anonymous Function #x3020010F369F> #<Compiled-function PREPL:DEBUGGER #x30200118929F> #<COMPILED-LEXICAL-CLOSURE (:INTERNAL PREPL:REPL) #x3020011BF61F>)
(PREPL:REPL)
(#<Anonymous Function #x3020010F3A2F> #<COMPILED-LEXICAL-CLOSURE (:INTERNAL PREPL::CONT PREPL:DEBUGGER) #x3020011BF65F>)
(PREPL:DEBUGGER #<UNBOUND-VARIABLE #x3020011C287D> #<Compiled-function PREPL:DEBUGGER #x30200118929F> NIL)
(CCL::BREAK-LOOP-HANDLE-ERROR #<UNBOUND-VARIABLE #x3020011C287D> 17592100104355)
(CCL::%ERROR #<UNBOUND-VARIABLE #x3020011C287D> NIL 17592100104355)
(CCL::%DEFAULT-UNBOUND-VARIABLE-RESTARTS 17592100104355 X)
(CCL::CHEAP-EVAL X)
(PREPL::INTERACTIVE-EVAL X)
(PREPL::%REP-ONE)
(PREPL::REP-ONE)
(PREPL::%REPL :BREAK-LEVEL 0 :NOPRINT NIL :INSPECT NIL :CONTINUABLE NIL :NOBANNER NIL)
(#<Anonymous Function #x3020010F369F> #<Compiled-function PREPL:DEBUGGER #x30200118929F> #<COMPILED-LEXICAL-CLOSURE (:INTERNAL PREPL:REPL) #x3020011DE79F>)
(PREPL:REPL)
(CCL::CALL-CHECK-REGS PREPL:REPL)
(CCL::TOPLEVEL-EVAL (PREPL:REPL) NIL)
(CCL::READ-LOOP :INPUT-STREAM #<SYNONYM-STREAM to *TERMINAL-IO* #x3020006B51DD> :OUTPUT-STREAM #<SYNONYM-STREAM to *TERMINAL-IO* #x3020006B507D> :BREAK-LEVEL 0 :PROMPT-FUNCTION #<Compiled-function (:INTERNAL CCL::READ-LOOP) (Non-Global)  #x30000052D15F>)
(CCL::RUN-READ-LOOP :BREAK-LEVEL 0)
(TOPLEVEL-LOOP)
((:INTERNAL (TOPLEVEL-FUNCTION (CCL::LISP-DEVELOPMENT-SYSTEM T))))
((:INTERNAL CCL::MAKE-MCL-LISTENER-PROCESS))
(CCL::RUN-PROCESS-INITIAL-FORM #<TTY-LISTENER listener(1) [Active] #x3020006B400D> (#<COMPILED-LEXICAL-CLOSURE (:INTERNAL CCL::MAKE-MCL-LISTENER-PROCESS) #x3020006B3B3F>))
((:INTERNAL (CCL::%PROCESS-PRESET-INTERNAL (PROCESS))) #<TTY-LISTENER listener(1) [Active] #x3020006B400D> (#<COMPILED-LEXICAL-CLOSURE (:INTERNAL CCL::MAKE-MCL-LISTENER-PROCESS) #x3020006B3B3F>))
((:INTERNAL CCL::THREAD-MAKE-STARTUP-FUNCTION))
[2] CL-USER> :zo
(PREPL::%REP-ONE)
(PREPL::REP-ONE)
(PREPL::%REPL :BREAK-LEVEL 2 :NOPRINT NIL :INSPECT NIL :CONTINUABLE NIL :NOBANNER T)
(#<Anonymous Function #x3020010F369F> #<Compiled-function PREPL:DEBUGGER #x30200118929F> #<COMPILED-LEXICAL-CLOSURE (:INTERNAL PREPL:REPL) #x3020011BA93F>)
(PREPL:REPL)
(#<Anonymous Function #x3020010F3A2F> #<COMPILED-LEXICAL-CLOSURE (:INTERNAL PREPL::CONT PREPL:DEBUGGER) #x3020011BA97F>)
(PREPL:DEBUGGER #<UNBOUND-VARIABLE #x3020011BF07D> #<Compiled-function PREPL:DEBUGGER #x30200118929F> NIL)
(CCL::BREAK-LOOP-HANDLE-ERROR #<UNBOUND-VARIABLE #x3020011BF07D> 17592100104127)
(CCL::%ERROR #<UNBOUND-VARIABLE #x3020011BF07D> NIL 17592100104127)
(CCL::%DEFAULT-UNBOUND-VARIABLE-RESTARTS 17592100104127 X)
(CCL::CHEAP-EVAL X)
(PREPL::INTERACTIVE-EVAL X)
(PREPL::%REP-ONE)
(PREPL::REP-ONE)
(PREPL::%REPL :BREAK-LEVEL 1 :NOPRINT NIL :INSPECT NIL :CONTINUABLE NIL :NOBANNER T)
(#<Anonymous Function #x3020010F369F> #<Compiled-function PREPL:DEBUGGER #x30200118929F> #<COMPILED-LEXICAL-CLOSURE (:INTERNAL PREPL:REPL) #x3020011BF61F>)
(PREPL:REPL)
(#<Anonymous Function #x3020010F3A2F> #<COMPILED-LEXICAL-CLOSURE (:INTERNAL PREPL::CONT PREPL:DEBUGGER) #x3020011BF65F>)
(PREPL:DEBUGGER #<UNBOUND-VARIABLE #x3020011C287D> #<Compiled-function PREPL:DEBUGGER #x30200118929F> NIL)
(CCL::BREAK-LOOP-HANDLE-ERROR #<UNBOUND-VARIABLE #x3020011C287D> 17592100104355)
(CCL::%ERROR #<UNBOUND-VARIABLE #x3020011C287D> NIL 17592100104355)
(CCL::%DEFAULT-UNBOUND-VARIABLE-RESTARTS 17592100104355 X)
(CCL::CHEAP-EVAL X)
(PREPL::INTERACTIVE-EVAL X)
(PREPL::%REP-ONE)
(PREPL::REP-ONE)
(PREPL::%REPL :BREAK-LEVEL 0 :NOPRINT NIL :INSPECT NIL :CONTINUABLE NIL :NOBANNER NIL)
(#<Anonymous Function #x3020010F369F> #<Compiled-function PREPL:DEBUGGER #x30200118929F> #<COMPILED-LEXICAL-CLOSURE (:INTERNAL PREPL:REPL) #x3020011DE79F>)
(PREPL:REPL)
(CCL::CALL-CHECK-REGS PREPL:REPL)
(CCL::TOPLEVEL-EVAL (PREPL:REPL) NIL)
(CCL::READ-LOOP :INPUT-STREAM #<SYNONYM-STREAM to *TERMINAL-IO* #x3020006B51DD> :OUTPUT-STREAM #<SYNONYM-STREAM to *TERMINAL-IO* #x3020006B507D> :BREAK-LEVEL 0 :PROMPT-FUNCTION #<Compiled-function (:INTERNAL CCL::READ-LOOP) (Non-Global)  #x30000052D15F>)
(CCL::RUN-READ-LOOP :BREAK-LEVEL 0)
(TOPLEVEL-LOOP)
((:INTERNAL (TOPLEVEL-FUNCTION (CCL::LISP-DEVELOPMENT-SYSTEM T))))
((:INTERNAL CCL::MAKE-MCL-LISTENER-PROCESS))
(CCL::RUN-PROCESS-INITIAL-FORM #<TTY-LISTENER listener(1) [Active] #x3020006B400D> (#<COMPILED-LEXICAL-CLOSURE (:INTERNAL CCL::MAKE-MCL-LISTENER-PROCESS) #x3020006B3B3F>))
((:INTERNAL (CCL::%PROCESS-PRESET-INTERNAL (PROCESS))) #<TTY-LISTENER listener(1) [Active] #x3020006B400D> (#<COMPILED-LEXICAL-CLOSURE (:INTERNAL CCL::MAKE-MCL-LISTENER-PROCESS) #x3020006B3B3F>))
((:INTERNAL CCL::THREAD-MAKE-STARTUP-FUNCTION))
[2] CL-USER> :exit

SBCL

Portable REPL on SBCL, main thread.  Type :help for help.
CL-USER> x

Debugger entered for condition: #<UNBOUND-VARIABLE X {100693D343}>: The variable X is unbound. Available restarts: 0 [ABORT] Reduce debugger level (to debug level 0). 1 Abort to REPL 2 [ABORT-TO-OUTMOST-REPL] Abort to outmost REPL 3 Exit debugger, returning to top level. [1] CL-USER> x

Debugger entered for condition: #<UNBOUND-VARIABLE X {100694CA03}>: The variable X is unbound. Available restarts: 0 [ABORT] Reduce debugger level (to debug level 1). 1 Reduce debugger level (to debug level 0). 2 Abort to REPL 3 [ABORT-TO-OUTMOST-REPL] Abort to outmost REPL 4 Exit debugger, returning to top level. [2] CL-USER> x

Debugger entered for condition: #<UNBOUND-VARIABLE X {1006953D93}>: The variable X is unbound. Available restarts: 0 [ABORT] Reduce debugger level (to debug level 2). 1 Reduce debugger level (to debug level 1). 2 Reduce debugger level (to debug level 0). 3 Abort to REPL 4 [ABORT-TO-OUTMOST-REPL] Abort to outmost REPL 5 Exit debugger, returning to top level. [3] CL-USER> :ab

[2] CL-USER> :ab

[1] CL-USER> :ab

CL-USER> x

Debugger entered for condition: #<UNBOUND-VARIABLE X {100695FE93}>: The variable X is unbound. Available restarts: 0 [ABORT] Reduce debugger level (to debug level 0). 1 Abort to REPL 2 [ABORT-TO-OUTMOST-REPL] Abort to outmost REPL 3 Exit debugger, returning to top level. [1] CL-USER> x

Debugger entered for condition: #<UNBOUND-VARIABLE X {1006966313}>: The variable X is unbound. Available restarts: 0 [ABORT] Reduce debugger level (to debug level 1). 1 Reduce debugger level (to debug level 0). 2 Abort to REPL 3 [ABORT-TO-OUTMOST-REPL] Abort to outmost REPL 4 Exit debugger, returning to top level. [2] CL-USER> :res

CL-USER> x

Debugger entered for condition: #<UNBOUND-VARIABLE X {100696EA63}>: The variable X is unbound. Available restarts: 0 [ABORT] Reduce debugger level (to debug level 0). 1 Abort to REPL 2 [ABORT-TO-OUTMOST-REPL] Abort to outmost REPL 3 Exit debugger, returning to top level. [1] CL-USER> x

Debugger entered for condition: #<UNBOUND-VARIABLE X {1006974F33}>: The variable X is unbound. Available restarts: 0 [ABORT] Reduce debugger level (to debug level 1). 1 Reduce debugger level (to debug level 0). 2 Abort to REPL 3 [ABORT-TO-OUTMOST-REPL] Abort to outmost REPL 4 Exit debugger, returning to top level. [2] CL-USER> :bt ((LAMBDA (CONIUM::DEBUGGER-LOOP-FN) :IN "conium-20101006-git/sbcl.lisp") #<CLOSURE (LAMBDA NIL :IN PREPL::BT-CMD) {100697973B}>) (PREPL::PROCESS-COMMAND #S(PREPL::USER-COMMAND :INPUT ":bt" :FUNC #<FUNCTION PREPL::BT-CMD> :ARGS NIL :HNUM 2)) (PREPL::%REP-ONE) (PREPL::REP-ONE) (PREPL::%REPL :BREAK-LEVEL NIL :NOPRINT NIL :INSPECT NIL :CONTINUABLE NIL :NOBANNER NIL) ((LAMBDA (CONIUM::HOOK CONIUM::FUN) :IN "conium-20101006-git/sbcl.lisp") #<FUNCTION PREPL:DEBUGGER> #<CLOSURE (LAMBDA NIL :IN PREPL:REPL) {1006977F4B}>) (PREPL:REPL) ((LAMBDA (CONIUM::DEBUGGER-LOOP-FN) :IN "conium-20101006-git/sbcl.lisp") #<CLOSURE (LAMBDA NIL :IN PREPL:DEBUGGER) {1006977F2B}>) (PREPL:DEBUGGER #<UNBOUND-VARIABLE X {1006974F33}> #<unused argument> NIL) (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* #<UNBOUND-VARIABLE X {1006974F33}>) (INVOKE-DEBUGGER #<UNBOUND-VARIABLE X {1006974F33}>) (ERROR UNBOUND-VARIABLE :NAME X) (SB-KERNEL::UNBOUND-SYMBOL-ERROR-HANDLER #<unavailable argument> #.(SB-SYS:INT-SAP #X7FFFF6D9E770) #<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #X7FFFF6D9E100 :TYPE (* (STRUCT SB-VM::OS-CONTEXT-T-STRUCT))> (1051)) (SB-KERNEL:INTERNAL-ERROR #.(SB-SYS:INT-SAP #X7FFFF6D9E100) #<unavailable argument>) ("foreign function: call_into_lisp") ("foreign function: funcall2") ("foreign function: interrupt_internal_error") ("foreign function: handle_trap") ("foreign function: #x411F4F") (SB-INT:SIMPLE-EVAL-IN-LEXENV X #<NULL-LEXENV>) (EVAL X) (PREPL::INTERACTIVE-EVAL X) (PREPL::%REP-ONE) (PREPL::REP-ONE) (PREPL::%REPL :BREAK-LEVEL NIL :NOPRINT NIL :INSPECT NIL :CONTINUABLE NIL :NOBANNER NIL) ((LAMBDA (CONIUM::HOOK CONIUM::FUN) :IN "conium-20101006-git/sbcl.lisp") #<FUNCTION PREPL:DEBUGGER> #<CLOSURE (LAMBDA NIL :IN PREPL:REPL) {1006970F0B}>) (PREPL:REPL) ((LAMBDA (CONIUM::DEBUGGER-LOOP-FN) :IN "conium-20101006-git/sbcl.lisp") #<CLOSURE (LAMBDA NIL :IN PREPL:DEBUGGER) {1006970EEB}>) (PREPL:DEBUGGER #<UNBOUND-VARIABLE X {100696EA63}> #<unused argument> NIL) (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* #<UNBOUND-VARIABLE X {100696EA63}>) (INVOKE-DEBUGGER #<UNBOUND-VARIABLE X {100696EA63}>) (ERROR UNBOUND-VARIABLE :NAME X) (SB-KERNEL::UNBOUND-SYMBOL-ERROR-HANDLER #<unavailable argument> #.(SB-SYS:INT-SAP #X7FFFF6D9F580) #<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #X7FFFF6D9EF00 :TYPE (* (STRUCT SB-VM::OS-CONTEXT-T-STRUCT))> (1051)) (SB-KERNEL:INTERNAL-ERROR #.(SB-SYS:INT-SAP #X7FFFF6D9EF00) #<unavailable argument>) ("foreign function: call_into_lisp") ("foreign function: funcall2") ("foreign function: interrupt_internal_error") ("foreign function: handle_trap") ("foreign function: #x411F4F") (SB-INT:SIMPLE-EVAL-IN-LEXENV X #<NULL-LEXENV>) (EVAL X) (PREPL::INTERACTIVE-EVAL X) (PREPL::%REP-ONE) (PREPL::REP-ONE) (PREPL::%REPL :BREAK-LEVEL NIL :NOPRINT NIL :INSPECT NIL :CONTINUABLE NIL :NOBANNER NIL) (SB-THREAD::CALL-WITH-NEW-SESSION #<CLOSURE (LABELS #:FB-NAME-2334 :IN PREPL::INVOKE-WITH-SESSION-WORKAROUND-IF-ON-SBCL) {100693926B}>) (PREPL::INVOKE-WITH-SESSION-WORKAROUND-IF-ON-SBCL #<CLOSURE (LAMBDA NIL :IN PREPL:REPL) {100693924B}>) ((LAMBDA (CONIUM::HOOK CONIUM::FUN) :IN "conium-20101006-git/sbcl.lisp") #<FUNCTION PREPL:DEBUGGER> #<CLOSURE (LAMBDA NIL :IN PREPL:REPL) {100693920B}>) (PREPL:REPL) (SB-INT:SIMPLE-EVAL-IN-LEXENV (PREPL:REPL) #<NULL-LEXENV>) (EVAL (PREPL:REPL)) (INTERACTIVE-EVAL (PREPL:REPL) :EVAL NIL) (SB-IMPL::REPL-FUN NIL) ((LAMBDA NIL :IN SB-IMPL::TOPLEVEL-REPL)) (SB-IMPL::%WITH-REBOUND-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN SB-IMPL::TOPLEVEL-REPL) {100518C87B}>) (SB-IMPL::TOPLEVEL-REPL NIL) (SB-IMPL::TOPLEVEL-INIT) ((FLET #:WITHOUT-INTERRUPTS-BODY-60 :IN SAVE-LISP-AND-DIE)) ((LABELS SB-IMPL::RESTART-LISP :IN SAVE-LISP-AND-DIE)) [2] CL-USER> :zo ((LAMBDA (CONIUM::DEBUGGER-LOOP-FN) :IN "conium-20101006-git/sbcl.lisp") #<FUNCTION (LAMBDA NIL :IN PREPL::ZOOM-CMD) {100683D88B}>) (PREPL::PROCESS-COMMAND #S(PREPL::USER-COMMAND :INPUT ":zo" :FUNC #<FUNCTION PREPL::ZOOM-CMD> :ARGS NIL :HNUM 3)) (PREPL::%REP-ONE) (PREPL::REP-ONE) (PREPL::%REPL :BREAK-LEVEL NIL :NOPRINT NIL :INSPECT NIL :CONTINUABLE NIL :NOBANNER NIL) ((LAMBDA (CONIUM::HOOK CONIUM::FUN) :IN "conium-20101006-git/sbcl.lisp") #<FUNCTION PREPL:DEBUGGER> #<CLOSURE (LAMBDA NIL :IN PREPL:REPL) {1006977F4B}>) (PREPL:REPL) ((LAMBDA (CONIUM::DEBUGGER-LOOP-FN) :IN "conium-20101006-git/sbcl.lisp") #<CLOSURE (LAMBDA NIL :IN PREPL:DEBUGGER) {1006977F2B}>) (PREPL:DEBUGGER #<UNBOUND-VARIABLE X {1006974F33}> #<unused argument> NIL) (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* #<UNBOUND-VARIABLE X {1006974F33}>) (INVOKE-DEBUGGER #<UNBOUND-VARIABLE X {1006974F33}>) (ERROR UNBOUND-VARIABLE :NAME X) (SB-KERNEL::UNBOUND-SYMBOL-ERROR-HANDLER #<unavailable argument> #.(SB-SYS:INT-SAP #X7FFFF6D9E770) #<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #X7FFFF6D9E100 :TYPE (* (STRUCT SB-VM::OS-CONTEXT-T-STRUCT))> (1051)) (SB-KERNEL:INTERNAL-ERROR #.(SB-SYS:INT-SAP #X7FFFF6D9E100) #<unavailable argument>) ("foreign function: call_into_lisp") ("foreign function: funcall2") ("foreign function: interrupt_internal_error") ("foreign function: handle_trap") ("foreign function: #x411F4F") (SB-INT:SIMPLE-EVAL-IN-LEXENV X #<NULL-LEXENV>) (EVAL X) (PREPL::INTERACTIVE-EVAL X) (PREPL::%REP-ONE) (PREPL::REP-ONE) (PREPL::%REPL :BREAK-LEVEL NIL :NOPRINT NIL :INSPECT NIL :CONTINUABLE NIL :NOBANNER NIL) ((LAMBDA (CONIUM::HOOK CONIUM::FUN) :IN "conium-20101006-git/sbcl.lisp") #<FUNCTION PREPL:DEBUGGER> #<CLOSURE (LAMBDA NIL :IN PREPL:REPL) {1006970F0B}>) (PREPL:REPL) ((LAMBDA (CONIUM::DEBUGGER-LOOP-FN) :IN "conium-20101006-git/sbcl.lisp") #<CLOSURE (LAMBDA NIL :IN PREPL:DEBUGGER) {1006970EEB}>) (PREPL:DEBUGGER #<UNBOUND-VARIABLE X {100696EA63}> #<unused argument> NIL) (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* #<UNBOUND-VARIABLE X {100696EA63}>) (INVOKE-DEBUGGER #<UNBOUND-VARIABLE X {100696EA63}>) (ERROR UNBOUND-VARIABLE :NAME X) (SB-KERNEL::UNBOUND-SYMBOL-ERROR-HANDLER #<unavailable argument> #.(SB-SYS:INT-SAP #X7FFFF6D9F580) #<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #X7FFFF6D9EF00 :TYPE (* (STRUCT SB-VM::OS-CONTEXT-T-STRUCT))> (1051)) (SB-KERNEL:INTERNAL-ERROR #.(SB-SYS:INT-SAP #X7FFFF6D9EF00) #<unavailable argument>) ("foreign function: call_into_lisp") ("foreign function: funcall2") ("foreign function: interrupt_internal_error") ("foreign function: handle_trap") ("foreign function: #x411F4F") (SB-INT:SIMPLE-EVAL-IN-LEXENV X #<NULL-LEXENV>) (EVAL X) (PREPL::INTERACTIVE-EVAL X) (PREPL::%REP-ONE) (PREPL::REP-ONE) (PREPL::%REPL :BREAK-LEVEL NIL :NOPRINT NIL :INSPECT NIL :CONTINUABLE NIL :NOBANNER NIL) (SB-THREAD::CALL-WITH-NEW-SESSION #<CLOSURE (LABELS #:FB-NAME-2334 :IN PREPL::INVOKE-WITH-SESSION-WORKAROUND-IF-ON-SBCL) {100693926B}>) (PREPL::INVOKE-WITH-SESSION-WORKAROUND-IF-ON-SBCL #<CLOSURE (LAMBDA NIL :IN PREPL:REPL) {100693924B}>) ((LAMBDA (CONIUM::HOOK CONIUM::FUN) :IN "conium-20101006-git/sbcl.lisp") #<FUNCTION PREPL:DEBUGGER> #<CLOSURE (LAMBDA NIL :IN PREPL:REPL) {100693920B}>) (PREPL:REPL) (SB-INT:SIMPLE-EVAL-IN-LEXENV (PREPL:REPL) #<NULL-LEXENV>) (EVAL (PREPL:REPL)) (INTERACTIVE-EVAL (PREPL:REPL) :EVAL NIL) (SB-IMPL::REPL-FUN NIL) ((LAMBDA NIL :IN SB-IMPL::TOPLEVEL-REPL)) (SB-IMPL::%WITH-REBOUND-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN SB-IMPL::TOPLEVEL-REPL) {100518C87B}>) (SB-IMPL::TOPLEVEL-REPL NIL) (SB-IMPL::TOPLEVEL-INIT) ((FLET #:WITHOUT-INTERRUPTS-BODY-60 :IN SAVE-LISP-AND-DIE)) ((LABELS SB-IMPL::RESTART-LISP :IN SAVE-LISP-AND-DIE)) [2] CL-USER> :exit

まとめ

 今回は、preplを紹介してみました。
REPLを良く使う人が複数の処理系を跨って利用する場合、微妙に異なるコマンド体系を統一したいという場合には便利かもしれないですね。

Older entries (1723 remaining)