定数シンボルに fset

それにしても elisp ってなんで list 操作の関数をもうちょっと潤沢に標準でサポートしてくれないものか。
cl 関数とか名前分かりづらいし長い。めんどくさい。

で、名前空間なんとかして標準で添付できないのかと考えてて、ふと思ったのが、keyword シンボルに関数定義できるんだっけ?

(set :hoge 1)

=> Attempt to set a constant symbol: :hoge

変数セルには何も代入できない。これは知ってた。

(fset :hoge (lambda (x) (1+ x)))
(:hoge 3)

=> 4

!!!!

関数セルには代入できるんじゃん。びっくりしたー。

というわけで

(defun :filter (pred list) 
  (remq nil 
        (mapcar 
         (lambda (x) (and (funcall pred x) x))
         list)))
(:filter (lambda (x) (zerop (mod x 2))) '(1 2 3 4 5))

=> (2 4)

みたいな感じでいいから lisp 業界で一般的な関数ぐらいは標準で呼び出せればいいのに。

(let ((res))
  (mapatoms
   (lambda (x)
     (when (and (keywordp x) (fboundp x))
       (setq res (cons x res))))
   obarray)
  res)

obarray の中を走査してみたけど、 keyword に関数定義しているブツは手元にはなさそう。

ついでに `lambda' も長いです。gauche みたいに一文字 (^) にできるといいのに。

(fset '^ (symbol-function 'lambda))

これも

(defalias '^ 'lambda)

これもだめ。。

((lambda () 'a))

=> a

((^ () 'a))

=> Invalid function: (^ nil (quote a))

なんか方法あるっけ。