定数シンボルに 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))
なんか方法あるっけ。