Skip to content

Commit

Permalink
Changed fn and fnn interface.
Browse files Browse the repository at this point in the history
  • Loading branch information
Tomohiro Matsuyama committed Jan 8, 2011
1 parent c101c74 commit 39be4da
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 26 deletions.
41 changes: 24 additions & 17 deletions README.markdown
Expand Up @@ -8,43 +8,49 @@ Usage

### fn

(fn &rest body)
fn form => lambda-form

`fn` macro returns `lambda` form of `body`. If special symbols starting with `%` are found in `body`, its symbols will be placed to lambda-list of `lambda` form. Special symbol `%` represents its first argument. Special symbol formed `%<n>` represents its `n`'th argument. Special symbol `%&` represents its rest of arguments.
`fn` macro returns `lambda` form of anonymous function `form`. If special symbols starting with `%` are found in `form`, its symbols will be placed to lambda-list of `lambda` form. Special symbol `%` represents its first argument. Special symbol formed `%<n>` represents its `n`'th argument. Special symbol `%&` represents its rest of arguments.

#### Examples

(macroexpand '(fn * % %))
(macroexpand '(fn (* % %)))
; => #'(LAMBDA (%) (* % %))
(funcall (fn * % %) 3)

(funcall (fn (* % %)) 3)
; => 9
(macroexpand '(fn mapcar %2 %1))
; => #'(LAMBDA (%1 %2) (mapcar %2 %1))
(funcall (fn mapcar %2 %1) '(1 2 3) (fn * % %))

(macroexpand '(fn (mapcar %2 %1)))
; => #'(LAMBDA (%1 %2) (MAPCAR %2 %1))

(funcall (fn (mapcar %2 %1)) '(1 2 3) (fn (* % %)))
; => 1 4 9
(macroexpand '(fn apply #'+ 1 2 3 %&))

(macroexpand '(fn (apply #'+ 1 2 3 %&)))
; => #'(LAMBDA (&REST %&) (APPLY #'+ 1 2 3 %&))
(funcall (fn apply #'+ 1 2 3 %&) 4 5)

(funcall (fn (apply #'+ 1 2 3 %&)) 4 5)
; => 15

### fnn

(fnn narg &rest body)
fnn narg form => lambda-form

Like `fn` except that `fnn` macro can take a number of arguments of the anonymous functions.
Like `fn` except that `fnn` macro can take the number of arguments of the anonymous function.

#### Examples

(macroexpand '(fnn 3 eq %2 1))
; => #'(LAMBDA (#:IGNORE_1_896 %2 #:IGNORE_3_897)
(DECLARE (IGNORE #:IGNORE_1_896 #:IGNORE_3_897))
(EQ %2 1))
(funcall (fnn 3 eq %2 1) 3 1 2)
(macroexpand '(fnn 3 (eq %2 1)))
; => #'(LAMBDA (#:IGNORE_1_846 %2 #:IGNORE_3_847)
(DECLARE (IGNORE #:IGNORE_1_846 #:IGNORE_3_847))
(EQ %2 1))

(funcall (fnn 3 (eq %2 1)) 3 1 2)
; => T

### enable-fn-syntax

(enable-fn-syntax)
enable-fn-syntax

By calling this function, you can use special syntax `#%(...)` instead of `fn` macro. Any forms of `fn` macro can be used. If an integer is suppied after `#%`, `fnn` macro will be used with the integer instead of `fn`.

Expand All @@ -53,6 +59,7 @@ By calling this function, you can use special syntax `#%(...)` instead of `fn` m
(enable-fn-syntax)
(funcall #%(* % %) 3)
; => 9

(funcall #%3(eq %2 1) 3 1 2)
; => T

Expand Down
18 changes: 9 additions & 9 deletions anonfun.lisp
Expand Up @@ -62,27 +62,27 @@
(setf lambda-list (append lambda-list `(&aux ,aux))))
(return (values lambda-list ignore-vars)))))

(defun make-fn (narg body)
(defun make-fn (narg form)
(multiple-value-bind (lambda-list ignore-vars)
(make-lambda-list narg (extract-args body))
(make-lambda-list narg (extract-args form))
`(lambda ,lambda-list
,@(when ignore-vars
`((declare (ignore ,@ignore-vars))))
,body))))
,form))))

(defmacro fn (&rest body)
(make-fn nil body))
(defmacro fn (form)
(make-fn nil form))

(defmacro fnn (narg &rest body)
(make-fn narg body))
(defmacro fnn (narg form)
(make-fn narg form))

(defun fn-reader (stream sub-char numarg)
(declare (ignore sub-char))
(unless numarg (setf numarg 1))
(let ((form (read stream t nil t)))
(if (integerp form)
`(fnn ,form ,@(read stream t nil t))
`(fn ,@form))))
`(fnn ,form ,(read stream t nil t))
`(fn ,form))))

(defun enable-fn-syntax ()
(set-dispatch-macro-character #\# #\% #'fn-reader))

0 comments on commit 39be4da

Please sign in to comment.