There is still far too much functional noise in the two-line combinator samefringe. Here's how I'd really like to write it:
samefringe = (composition (or eq (and (and* consp) ((and (eq car) (samefringe cdr)) rotate-right))))
rotate-right = (while (composition (consp car)) (composition (cons caar (cons cdar cdr))))
Something like this would do it:
(defmacro composition (body)
(labels ((translate (term)
(typecase term
(symbol (if (fboundp term) `#',term term))
(cons (case (car term)
(or `(hor ,@(mapcar #'translate (cdr term))))
(and `(hand ,@(mapcar #'translate (cdr term))))
(t (cons (if (cddr term) 'h '|.:|) (mapcar #'translate term)))))
(t `(k ,term)))))
(translate body)))
This is a language where composition, not application, is the Form Without A Name.
(Edit 6 January: fixed examples.)
No comments:
Post a Comment
It's OK to comment on old posts.