Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2009-02-24

今日の発見 2

| 01:00 | 今日の発見 2 - わだばLisperになる を含むブックマーク はてなブックマーク - 今日の発見 2 - わだばLisperになる

前回キーワードに関数を付けてみましたが、他の定数はどうなんだろうということで試してみました。

(defun t (n) n)

(t 3)
;=> 3

なるほど、パッケージロックの警告を貰いますが、破ればOKみたいです。

(defun nil (n) n)

(nil 3) ;=> 3

なるほど、なるほど。

nilは警告がでないのはどうしてでしょう。*1

(() 3) ;=> 3

これはwww

(setf (symbol-function ()) #'funcall)

(() ((lambda (f) (lambda (n) (() f f n)))
     (lambda (f n)
       (if (zerop n)
           1
           (* n (() f f (- n 1))))))
 10)
;=> 3628800
((#|関数名の内部にコメントが書けるのは画期的|#) '+ 3 3)
;=> 6

今日の発見

| 00:42 | 今日の発見 - わだばLisperになる を含むブックマーク はてなブックマーク - 今日の発見 - わだばLisperになる

LISPをみんなで勉強しよう! : 束縛されている?

を読んでいて、おおそういえば、

(boundp :foo)
;=> T

なんだね、という話をLingrのCommon Lisp部屋でしていたのですが、

じゃあ、他のセルはどうなんだろうということで試してみたところ

(fboundp :foo) ;=> NIL

(symbol-value :foo) ;=> FOO

(setf (symbol-plist :foo) 'foo)

(setf (get :foo 'foo) 3)
(get :foo 'foo);=> 3

(symbol-plist :foo) ;=> (FOO 3)

(setf (symbol-function :foo) (lambda (x) x))

(:foo 3) ;=> 3

(defun :bar (n)
  n)

(:bar 3) ;=> 3

(funcall #':bar 3)
;=> 3

(flet ((:quux (n) n)) (:quux 8))
;=> 8

あれ、普通に、:barみたいな関数が作れるじゃないですか!

ずっと知りませんでした。

:barは、keyword:barという関数を定義していることになるのですが、変数セルは変更できなくても他には値を格納できるんですね。

exportしなくても、どのパッケージからも使えたりするんですが、これは禁断の技なのでしょうか。

*1:Tを定義したときにロックを破っていたようです