Skip to content

Instantly share code, notes, and snippets.

@miyamuko
Created September 10, 2011 05:27
Show Gist options
  • Select an option

  • Save miyamuko/1207969 to your computer and use it in GitHub Desktop.

Select an option

Save miyamuko/1207969 to your computer and use it in GitHub Desktop.
clisp の sys::hash-table-iterator などを #xyzzy Lisp に移植
(defun package-iterator (package-list &rest symbol-type)
(when (endp symbol-type)
(error "symbol-typeが指定されていません"))
(when (atom package-list)
(setf package-list (list package-list)))
(let (current-symbols)
#'(lambda ()
(when (or current-symbols
symbol-type)
(unless current-symbols
(macrolet ((push-all ()
(loop
(multiple-value-bind (f symbol type package)
(next)
(unless f
(return))
(push (list f symbol type) current-symbols)))))
(case (car symbol-type)
(:external
(with-package-iterator (next package-list :external)
(push-all)))
(:internal
(with-package-iterator (next package-list :internal)
(push-all)))
(:inherited
(with-package-iterator (next (mapcan #'package-use-list package-list) :external)
(push-all)))
(t (error "未定義のシンボルタイプです: ~S" (car symbol-type))))
(setf symbol-type (cdr symbol-type)
current-symbols (nreverse current-symbols))
))
(values-list (pop current-symbols))))))
(defun package-iterate (iterator)
(funcall iterator))
(defun hash-table-iterator (hash-table)
(let ((i 0))
#'(lambda ()
(multiple-value-setq (i key val)
(si:*enum-hash-table hash-table i))
(if i (values t key val)))))
(defun hash-table-iterate (iterator)
(funcall iterator))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment