elispで 「sleep sort」を実装してみた

今流行の 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はど素人なので無理でした。


マクロでもないのに、バッククォートとかコンマを使うのは
どうなんでしょう ?