(require 'cl)
(defun op--collect-args (body)
(cl-flet ((walker (body &optional args)
(if (null body)
args
(if (symbolp body)
(when (eql ?\_ (elt (symbol-name body) 0))
(cons body args))
(if (listp body)
(append (op--collect-args (car body))
(op--collect-args (cdr body))
))))))
(sort (walker body)
(lambda (a b)
(< (string-to-number (subseq (symbol-name a) 1))
(string-to-number (subseq (symbol-name b) 1)))))))
(defmacro op (&rest body)
`(lambda ,(op--collect-args body)
,@body))
(defun blank-line-p ()
(= (current-indentation)
(- (line-end-position) (line-beginning-position))))
(defun helm-generate-lisp-skeleton ()
(interactive)
(let ((skeletons '(("defunction" . skel-defun)
("defmacro" . skel-defmacro)
("defsystem" . skel-defsystem)
("defpackage" . skel-defpackage)
("defparameter" . skel-defparameter)
("defvar" . skel-defvar))))
(funcall (helm-comp-read "code template: " skeletons))
(evil-insert 1)))
(defun create-system-files ()
(interactive)
(mapcar (lambda (it) (save-buffer (find-file (format "%s.lisp" (cadr it)))))
(getf (cddar (read-from-string
(buffer-substring (point)
(mark))))
:components)))
(defun slime-ecl ()
(interactive)
(let ((inferior-lisp-program "ecl"))
(slime)))
(defun slime-cmucl ()
(interactive)
(let ((inferior-lisp-program "cmucl"))
(slime)))
(defun slime-sbcl ()
(interactive)
(let ((inferior-lisp-program "sbcl"))
(slime)))
(defun slime-ccl ()
(interactive)
(let ((inferior-lisp-program "ccl"))
(slime)))
(defun find-use-clause (current-form)
(when current-form
(destructuring-bind (discriminator . packages) current-form
(case discriminator
(:use (remove-if (op (or (eql :cl _)))
(cdr current-form)))
(defpackage (find-use-clause
(find-if (lambda (f)
(and (listp f)
(eql (car f) :use)))
'(defpackage :tracking-sim (:use :cl :alexandria :serapeum) (:export)))))))))
(defun load-package-uses ()
(interactive)
(slime-eval-async `(ql:quickload ',(find-use-clause (list-at-point)))))
(defun paredit-wiggle-back ()
(paredit-forward)
(paredit-backward))
(defmacro defparedit-wrapper (name invoked-wrapper)
`(defun ,name ()
(interactive)
(paredit-wiggle-back)
(,invoked-wrapper)))
(defun set-exec-path-from-shell-PATH ()
"Set up Emacs' `exec-path' and PATH environment variable to match
that used by the user's shell.
This is particularly useful under Mac OSX, where GUI apps are not
started from a shell."
(interactive)
(let ((path-from-shell
(replace-regexp-in-string "[ \t\n]*$" ""
(shell-command-to-string
"zsh -c 'source ~/.zsh.d/dependencies/utils.zsh;source ~/.zsh.d/dependencies/path-setup.zsh;echo $PATH'")
)))
(setenv "PATH" path-from-shell)
(setq exec-path (split-string path-from-shell path-separator))))