今流行の sleep sortを emacs lispで書いてみた。
コード
deferred.elを使いました
(require 'deferred) (defvar sorted '()) (defun wait-func (elm) `(lambda () (deferred:$ (deferred:wait (* 1000 ,elm)) (deferred:nextc it (lambda (x) (push ,elm sorted)))))) (defun sleep-sort (lst) (setq sorted '()) (deferred:$ (apply 'deferred:parallel (mapcar 'wait-func lst)) (deferred:nextc it (lambda (nums) (message "%S" (reverse sorted)))))) (sleep-sort '(3 1 4 6)) ; ; (1 3 4 6)
無理矢理感がすごいです。
wait-funcを以下のように定義すると動いてくれないのはなんでなんだろう?
(defun wait-func (elm) (lambda () (deferred:$ (deferred:wait (* 1000 elm)) (deferred:nextc it (lambda (x) (push elm sorted))))))
マクロを使えばきれいに書けるのかもしれないですが、
lispはど素人なので無理でした。
マクロでもないのに、バッククォートとかコンマを使うのは
どうなんでしょう ?