そういえばOnLispに!ってマクロありましたね。

schemeだとfuncallが要らなくなるので綺麗になると書かれていたけれど…使い道が思いつかない。

(define-module onlisp-macros
  (use srfi-1) ;filter
  (module-exports !))
(select-module onlisp-macros)
  
(define *!-table* (make-hash-table))

(define-macro (! fun)
  (hash-table-get *!-table* fun))

(let ((src (apply append (map module-exports (all-modules))))
      (env (interaction-environment)))
  (for-each (lambda (x) 
	      (let1 x* (string->symbol (regexp-replace #/!$/ (symbol->string x) ""))
		(hash-table-put! *!-table* x* (eval x env))))
	    (filter (lambda (x)  (#/!$/ (symbol->string x))) src)))

;; (define xs (iota 10))
;; ((! span) even? xs)
;; xs ; => (0)