나는 카레 기능을 원할지도 모른다. 당신이 이런 짓을 상상해
(defun curry (op arg1)
(lambda (&rest args) (apply op (cons arg1 args))))
(funcall (curry #'+ 10) 20) ; ==> 30
(mapcar (curry #'+ 10) '(1 2 3 4)) ; ==> (11 12 13 14)
지금 defun
은 항상 전역 네임 스페이스의 기능을한다. 그것은 Scheme에서 클로저를 만드는 것과는 다릅니다.
(defun create-curried (name op arg1)
(setf (symbol-function name)
(lambda (&rest args) (apply op (cons arg1 args)))))
(create-curried '+x #'+ 10) ; ==> function
(+x 20) ; ==> 30
;; since it's a function, it even works with higher order functions
(mapcar create-curried '(+x -x /x *x) (list #'+ #'- #'/ #'*) '(10 10 10 10))
(/x 2) ; ==> 5
마지막 : 우리가 symbol-function
및 setf
를 사용 defun
으로 동일한 작업을 수행합니다. 매크로를 사용하면 매크로를 미리 정의 할 수 있습니다. 이와 flet
또는 labels
를 사용할 수 있도록
(defmacro defun-curried (newname oldname arg)
(if (and (symbolp newname) (symbolp oldname))
`(create-curried ',newname (function ,oldname) ,arg)
(error "Newname and Oldname need to be symbols")))
(defun-curried +xx + 20)
(+xx 10) ; ==> 30
oldname
는 어휘 범위에서 가져하지만 그것은 단지
defun
와 같은 글로벌되고 끝납니다.
사용 방법에 대한 예를 들려 줄 수 있습니까? 실제 코드가 가장 좋습니다. – zck