Skip to content

Instantly share code, notes, and snippets.

@joekarma
joekarma / gist:5565735
Created May 13, 2013 02:01
Common Lisp macro for easily creating new projects on subdomains of site.
(defvar *projects* nil)
(defmacro defproject (project-name (project-domain &key use)
&body project-routes)
(let ((project (alexandria:make-keyword project-name)))
(pushnew project *projects*)
(eval
(sort
(remove-if #'null
(mapcar (lambda (release)
(cons (ql-dist:name release)
(release-last-updated-date release)))
(ql-dist:provided-releases (ql-dist:find-dist "quicklisp")))
:key #'cdr)
#'local-time:timestamp<
:key #'cdr)
(defun release-last-updated-date (quicklisp-release)
(ppcre:register-groups-bind (year month day)
("-(\\d{4})(\\d{2})(\\d{2})(?:-|$)" (ql-dist:prefix quicklisp-release))
(local-time:encode-timestamp 0 0 0 0 (parse-integer day) (parse-integer month) (parse-integer year))))
(mapcar (lambda (d)
(format nil "~{~a~^-~}"
(series:collect
(series:until-if
(lambda (string-part)
(ppcre:scan "^\\d{8}$" string-part))
(series:scan (ppcre:split "-" (lastcar (pathname-directory d))))))))
(list-directory
(merge-pathnames
#P"software/"
@joekarma
joekarma / gist:5506854
Last active December 16, 2015 22:29
Install every system / library / release in quicklisp. Download all the things.
(mapc #'ql::ensure-installed
(ql-dist:provided-releases
(ql-dist:find-dist "quicklisp")))
The value #<TRANSFORM :FLOAT
{0.0031 0.0000 0.0000 0.0000
0.0000 0.0042 0.0000 0.0000
0.0000 0.0000 0.0100 0.0000
0.0000 0.0000 -0.0025 1.0000}>
is not of type
ARRAY.
[Condition of type TYPE-ERROR]
Restarts:
(defun forgiving-subseq (seq &key (start 0) (seq-length (length seq)) (end seq-length))
(let ((empty-seq (subseq seq 0 0)))
(cond ((> start seq-length) empty-seq)
(t (subseq seq start (min seq-length end))))))
(defun group-seq (seq group-size)
(unless (and (>= group-size 1)
(integerp group-size))
(error "Group size must be an integer greater than zero."))
(loop with seq-length = (length seq)
CL-USER> (fad:pathname-as-directory #P"/Users/joekarma/src/tmp/test\\[one]")
#P"/Users/joekarma/src/tmp/test\\\\[one]/"
CL-USER> (fad:pathname-as-directory #P"/Users/joekarma/src/tmp/test\\[one]/")
#P"/Users/joekarma/src/tmp/test\\[one]/"
CL-USER> (defun gethash* (hash-table key &rest more-keys)
(cond ((null more-keys) (gethash key hash-table))
(t (apply #'gethash*
(append (list (gethash key hash-table)
(car more-keys))
(cdr more-keys))))))
GETHASH*
CL-USER> (gethash* (yason:parse "{foo:{bar:{baz:42}}}") "foo" "bar" "baz")
42
T
(defpackage :foo
(:use :cl)
(:export :baz))
(in-package :foo)
(defun baz ()
3)
(defpackage :bar