Genesis
In the beginning Man created the computer. Now the computer was
formless and empty, darkness was over the surface of the deep, and the
Spirit of Man was hovering over the terminal.
And Man said, "Let there be lisp," and there was lisp. Man saw that
the lisp was good.
---
welcome
⚡ ⚕ Welcome to the academy. ⚛ ♬
---
readme
The recommended way to become familiar with the academy is to start
with the first commit either on github or with local git tools and to
work your way through commits attempting to understand at least the
jist if not the entirety of what is going on. Or, alternatively, you
could just fire it up and with the help of HELP, explore.
---
random-element
> (dotimes (x 100) (princ (random-element '(see jack run))))
SEEJACKJACKRUNJACKRUNJACKJACKJACKSEEJACKRUNJACKSEEJACKJACKJACKRUNJACKSEERUNJACKRUNRUNJACKSEEJACKSEEJACKSEERUNSEEJACKRUNRUNRUNSEERUNRUNJACKRUNJACKJACKSEERUNRUNSEERUNJACKJACKRUNJACKRUNJACKJACKSEERUNSEERUNRUNRUNJACKRUNJACKSEEJACKJACKSEEJACKJACKSEESEERUNSEESEESEERUNJACKRUNSEESEESEERUNSEESEEJACKJACKSEERUNSEESEESEEJACKJACKRUNSEERUNRUNSEEJACKNIL
---
ensure-list
Pay attention! A very useful utility function is being introduced here.
> (ensure-list 'a)
(A)
> (ensure-list '(a))
(A)
Often used in looping and mapping to allow for handling both lists and singletons.
> (defun foo (arg)
(mapc 'princ (ensure-list arg)))
> (foo 1)
1
> (foo '(2 3))
23
---
unicode
There are many sets of unicode symbols easily entered with english names.
> (format t "~{~A~^ ~}~%" '(#\maltese_cross #\black_hexagon #\floral_heart))
✠ ⬢ ❦
> (show-unicode-characters :i-ching-symbols)
I-CHING-SYMBOLS
4DC0 : ䷀ #\HEXAGRAM_FOR_THE_CREATIVE_HEAVEN
4DC1 : ䷁ #\HEXAGRAM_FOR_THE_RECEPTIVE_EARTH
4DC2 : ䷂ #\HEXAGRAM_FOR_DIFFICULTY_AT_THE_BEGINNING
4DC3 : ䷃ #\HEXAGRAM_FOR_YOUTHFUL_FOLLY
4DC4 : ䷄ #\HEXAGRAM_FOR_WAITING
4DC5 : ䷅ #\HEXAGRAM_FOR_CONFLICT
4DC6 : ䷆ #\HEXAGRAM_FOR_THE_ARMY
4DC7 : ䷇ #\HEXAGRAM_FOR_HOLDING_TOGETHER
4DC8 : ䷈ #\HEXAGRAM_FOR_SMALL_TAMING
4DC9 : ䷉ #\HEXAGRAM_FOR_TREADING
4DCA : ䷊ #\HEXAGRAM_FOR_PEACE
4DCB : ䷋ #\HEXAGRAM_FOR_STANDSTILL
4DCC : ䷌ #\HEXAGRAM_FOR_FELLOWSHIP
4DCD : ䷍ #\HEXAGRAM_FOR_GREAT_POSSESSION
4DCE : ䷎ #\HEXAGRAM_FOR_MODESTY
4DCF : ䷏ #\HEXAGRAM_FOR_ENTHUSIASM
4DD0 : ䷐ #\HEXAGRAM_FOR_FOLLOWING
4DD1 : ䷑ #\HEXAGRAM_FOR_WORK_ON_THE_DECAYED
4DD2 : ䷒ #\HEXAGRAM_FOR_APPROACH
4DD3 : ䷓ #\HEXAGRAM_FOR_CONTEMPLATION
4DD4 : ䷔ #\HEXAGRAM_FOR_BITING_THROUGH
4DD5 : ䷕ #\HEXAGRAM_FOR_GRACE
4DD6 : ䷖ #\HEXAGRAM_FOR_SPLITTING_APART
4DD7 : ䷗ #\HEXAGRAM_FOR_RETURN
4DD8 : ䷘ #\HEXAGRAM_FOR_INNOCENCE
4DD9 : ䷙ #\HEXAGRAM_FOR_GREAT_TAMING
4DDA : ䷚ #\HEXAGRAM_FOR_MOUTH_CORNERS
4DDB : ䷛ #\HEXAGRAM_FOR_GREAT_PREPONDERANCE
4DDC : ䷜ #\HEXAGRAM_FOR_THE_ABYSMAL_WATER
4DDD : ䷝ #\HEXAGRAM_FOR_THE_CLINGING_FIRE
4DDE : ䷞ #\HEXAGRAM_FOR_INFLUENCE
4DDF : ䷟ #\HEXAGRAM_FOR_DURATION
4DE0 : ䷠ #\HEXAGRAM_FOR_RETREAT
4DE1 : ䷡ #\HEXAGRAM_FOR_GREAT_POWER
4DE2 : ䷢ #\HEXAGRAM_FOR_PROGRESS
4DE3 : ䷣ #\HEXAGRAM_FOR_DARKENING_OF_THE_LIGHT
4DE4 : ䷤ #\HEXAGRAM_FOR_THE_FAMILY
4DE5 : ䷥ #\HEXAGRAM_FOR_OPPOSITION
4DE6 : ䷦ #\HEXAGRAM_FOR_OBSTRUCTION
4DE7 : ䷧ #\HEXAGRAM_FOR_DELIVERANCE
4DE8 : ䷨ #\HEXAGRAM_FOR_DECREASE
4DE9 : ䷩ #\HEXAGRAM_FOR_INCREASE
4DEA : ䷪ #\HEXAGRAM_FOR_BREAKTHROUGH
4DEB : ䷫ #\HEXAGRAM_FOR_COMING_TO_MEET
4DEC : ䷬ #\HEXAGRAM_FOR_GATHERING_TOGETHER
4DED : ䷭ #\HEXAGRAM_FOR_PUSHING_UPWARD
4DEE : ䷮ #\HEXAGRAM_FOR_OPPRESSION
4DEF : ䷯ #\HEXAGRAM_FOR_THE_WELL
4DF0 : ䷰ #\HEXAGRAM_FOR_REVOLUTION
4DF1 : ䷱ #\HEXAGRAM_FOR_THE_CAULDRON
4DF2 : ䷲ #\HEXAGRAM_FOR_THE_AROUSING_THUNDER
4DF3 : ䷳ #\HEXAGRAM_FOR_THE_KEEPING_STILL_MOUNTAIN
4DF4 : ䷴ #\HEXAGRAM_FOR_DEVELOPMENT
4DF5 : ䷵ #\HEXAGRAM_FOR_THE_MARRYING_MAIDEN
4DF6 : ䷶ #\HEXAGRAM_FOR_ABUNDANCE
4DF7 : ䷷ #\HEXAGRAM_FOR_THE_WANDERER
4DF8 : ䷸ #\HEXAGRAM_FOR_THE_GENTLE_WIND
4DF9 : ䷹ #\HEXAGRAM_FOR_THE_JOYOUS_LAKE
4DFA : ䷺ #\HEXAGRAM_FOR_DISPERSION
4DFB : ䷻ #\HEXAGRAM_FOR_LIMITATION
4DFC : ䷼ #\HEXAGRAM_FOR_INNER_TRUTH
4DFD : ䷽ #\HEXAGRAM_FOR_SMALL_PREPONDERANCE
4DFE : ䷾ #\HEXAGRAM_FOR_AFTER_COMPLETION
4DFF : ䷿ #\HEXAGRAM_FOR_BEFORE_COMPLETION
---
petals-around-the-rose
> (petals-around-the-rose)
⚃ ⚂ ⚃ ⚄ ⚃ ⚃
6
---
random-do
Our first macro!
> (dotimes (x 10) (random-do (princ 'hop) (princ 'skip) (princ 'jump)))
HOPSKIPSKIPHOPJUMPSKIPSKIPJUMPSKIPSKIP
The random-do above expands at read time into
(CASE (RANDOM 3)
(0 (PRINC 'HOP))
(1 (PRINC 'SKIP))
(2 (PRINC 'JUMP)))
---
power-of-two-p
> (dotimes (x 64) (princ (if (power-of-two-p (1+ x)) #\flower " ")))
⚘⚘ ⚘ ⚘ ⚘ ⚘ ⚘
---
hilbert-space-filling-curve
> (hilbert-space-filling-curve)
─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─
┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐
│┌┐│┌┐└┐┌┘┌┐│┌┐│┌┐└┐┌┘┌┐│┌┐│┌┐└┐┌┘┌┐│┌┐│┌┐└┐┌┘┌┐│┌┐│┌┐└┐┌┘┌┐│┌┐│
└┘└┘│└─┘└─┘│└┘└┘│└─┘└─┘│└┘└┘│└─┘└─┘│└┘└┘│└─┘└─┘│└┘└┘│└─┘└─┘│└┘└┘
┌┐┌┐│┌─┐┌─┐│┌┐┌┐└┐┌──┐┌┘┌┐┌┐│┌─┐┌─┐│┌┐┌┐└┐┌──┐┌┘┌┐┌┐│┌─┐┌─┐│┌┐┌┐
│└┘│└┘┌┘└┐└┘│└┘│┌┘└┐┌┘└┐│└┘│└┘┌┘└┐└┘│└┘│┌┘└┐┌┘└┐│└┘│└┘┌┘└┐└┘│└┘│
└┐┌┘┌┐└┐┌┘┌┐└┐┌┘│┌┐││┌┐│└┐┌┘┌┐└┐┌┘┌┐└┐┌┘│┌┐││┌┐│└┐┌┘┌┐└┐┌┘┌┐└┐┌┘
┌┘└─┘└─┘└─┘└─┘└┐└┘└┘└┘└┘┌┘└─┘└─┘└─┘└─┘└┐└┘└┘└┘└┘┌┘└─┘└─┘└─┘└─┘└┐
│┌─┐┌─┐┌┐┌─┐┌─┐│┌┐┌┐┌┐┌┐└┐┌─┐┌─┐┌─┐┌─┐┌┘┌┐┌┐┌┐┌┐│┌─┐┌─┐┌┐┌─┐┌─┐│
└┘┌┘└┐└┘└┘┌┘└┐└┘│└┘││└┘│┌┘└┐└┘┌┘└┐└┘┌┘└┐│└┘││└┘│└┘┌┘└┐└┘└┘┌┘└┐└┘
┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐└┐┌┘└┐┌┘│┌┐│┌┐└┐┌┘┌┐│┌┐│└┐┌┘└┐┌┘┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐
│└─┘└─┘││└─┘└─┘│┌┘└──┘└┐└┘└┘│└─┘└─┘│└┘└┘┌┘└──┘└┐│└─┘└─┘││└─┘└─┘│
└┐┌──┐┌┘└┐┌──┐┌┘│┌─┐┌─┐│┌┐┌┐│┌─┐┌─┐│┌┐┌┐│┌─┐┌─┐│└┐┌──┐┌┘└┐┌──┐┌┘
┌┘└┐┌┘└┐┌┘└┐┌┘└┐└┘┌┘└┐└┘│└┘│└┘┌┘└┐└┘│└┘│└┘┌┘└┐└┘┌┘└┐┌┘└┐┌┘└┐┌┘└┐
│┌┐││┌┐││┌┐││┌┐│┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐│┌┐││┌┐││┌┐││┌┐│
└┘└┘└┘└┘└┘└┘└┘└┘│└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘│└┘└┘└┘└┘└┘└┘└┘└┘
┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐│┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐│┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐
│└┘││└┘││└┘││└┘│└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘│└┘││└┘││└┘││└┘│
└┐┌┘└┐┌┘└┐┌┘└┐┌┘┌┐└┐┌┘┌┐│┌┐│┌┐└┐┌┘┌┐│┌┐│┌┐└┐┌┘┌┐└┐┌┘└┐┌┘└┐┌┘└┐┌┘
┌┘└──┘└┐┌┘└──┘└┐│└─┘└─┘│└┘└┘│└─┘└─┘│└┘└┘│└─┘└─┘│┌┘└──┘└┐┌┘└──┘└┐
│┌─┐┌─┐││┌─┐┌─┐│└┐┌──┐┌┘┌┐┌┐│┌─┐┌─┐│┌┐┌┐└┐┌──┐┌┘│┌─┐┌─┐││┌─┐┌─┐│
└┘┌┘└┐└┘└┘┌┘└┐└┘┌┘└┐┌┘└┐│└┘│└┘┌┘└┐└┘│└┘│┌┘└┐┌┘└┐└┘┌┘└┐└┘└┘┌┘└┐└┘
┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐│┌┐││┌┐│└┐┌┘┌┐└┐┌┘┌┐└┐┌┘│┌┐││┌┐│┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐
│└─┘└─┘└┘└─┘└─┘│└┘└┘└┘└┘┌┘└─┘└─┘└─┘└─┘└┐└┘└┘└┘└┘│└─┘└─┘└┘└─┘└─┘│
└┐┌─┐┌─┐┌─┐┌─┐┌┘┌┐┌┐┌┐┌┐└┐┌─┐┌─┐┌─┐┌─┐┌┘┌┐┌┐┌┐┌┐└┐┌─┐┌─┐┌─┐┌─┐┌┘
┌┘└┐└┘┌┘└┐└┘┌┘└┐│└┘││└┘│┌┘└┐└┘┌┘└┐└┘┌┘└┐│└┘││└┘│┌┘└┐└┘┌┘└┐└┘┌┘└┐
│┌┐│┌┐└┐┌┘┌┐│┌┐│└┐┌┘└┐┌┘│┌┐│┌┐└┐┌┘┌┐│┌┐│└┐┌┘└┐┌┘│┌┐│┌┐└┐┌┘┌┐│┌┐│
└┘└┘│└─┘└─┘│└┘└┘┌┘└──┘└┐└┘└┘│└─┘└─┘│└┘└┘┌┘└──┘└┐└┘└┘│└─┘└─┘│└┘└┘
┌┐┌┐│┌─┐┌─┐│┌┐┌┐│┌─┐┌─┐│┌┐┌┐│┌─┐┌─┐│┌┐┌┐│┌─┐┌─┐│┌┐┌┐│┌─┐┌─┐│┌┐┌┐
│└┘│└┘┌┘└┐└┘│└┘│└┘┌┘└┐└┘│└┘│└┘┌┘└┐└┘│└┘│└┘┌┘└┐└┘│└┘│└┘┌┘└┐└┘│└┘│
└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘
┌┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└┐
│┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐┌─┐│
└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘┌┘└┐└┘
┌┐└┐┌┘┌┐│┌┐│┌┐└┐┌┘┌┐│┌┐│┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐│┌┐│┌┐└┐┌┘┌┐│┌┐│┌┐└┐┌┘┌┐
│└─┘└─┘│└┘└┘│└─┘└─┘│└┘└┘│└─┘└─┘││└─┘└─┘│└┘└┘│└─┘└─┘│└┘└┘│└─┘└─┘│
└┐┌──┐┌┘┌┐┌┐│┌─┐┌─┐│┌┐┌┐└┐┌──┐┌┘└┐┌──┐┌┘┌┐┌┐│┌─┐┌─┐│┌┐┌┐└┐┌──┐┌┘
┌┘└┐┌┘└┐│└┘│└┘┌┘└┐└┘│└┘│┌┘└┐┌┘└┐┌┘└┐┌┘└┐│└┘│└┘┌┘└┐└┘│└┘│┌┘└┐┌┘└┐
│┌┐││┌┐│└┐┌┘┌┐└┐┌┘┌┐└┐┌┘│┌┐││┌┐││┌┐││┌┐│└┐┌┘┌┐└┐┌┘┌┐└┐┌┘│┌┐││┌┐│
└┘└┘└┘└┘┌┘└─┘└─┘└─┘└─┘└┐└┘└┘└┘└┘└┘└┘└┘└┘┌┘└─┘└─┘└─┘└─┘└┐└┘└┘└┘└┘
┌┐┌┐┌┐┌┐└┐┌─┐┌─┐┌─┐┌─┐┌┘┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐└┐┌─┐┌─┐┌─┐┌─┐┌┘┌┐┌┐┌┐┌┐
│└┘││└┘│┌┘└┐└┘┌┘└┐└┘┌┘└┐│└┘││└┘││└┘││└┘│┌┘└┐└┘┌┘└┐└┘┌┘└┐│└┘││└┘│
└┐┌┘└┐┌┘│┌┐│┌┐└┐┌┘┌┐│┌┐│└┐┌┘└┐┌┘└┐┌┘└┐┌┘│┌┐│┌┐└┐┌┘┌┐│┌┐│└┐┌┘└┐┌┘
┌┘└──┘└┐└┘└┘│└─┘└─┘│└┘└┘┌┘└──┘└┐┌┘└──┘└┐└┘└┘│└─┘└─┘│└┘└┘┌┘└──┘└┐
│┌─┐┌─┐│┌┐┌┐│┌─┐┌─┐│┌┐┌┐│┌─┐┌─┐││┌─┐┌─┐│┌┐┌┐│┌─┐┌─┐│┌┐┌┐│┌─┐┌─┐│
└┘┌┘└┐└┘│└┘│└┘┌┘└┐└┘│└┘│└┘┌┘└┐└┘└┘┌┘└┐└┘│└┘│└┘┌┘└┐└┘│└┘│└┘┌┘└┐└┘
┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐└┐┌┘┌┐
│└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘││└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘└─┘│
└┐┌─┐┌─┐┌─┐┌─┐┌──┐┌─┐┌─┐┌─┐┌─┐┌┘└┐┌─┐┌─┐┌─┐┌─┐┌──┐┌─┐┌─┐┌─┐┌─┐┌┘
┌┘└┐└┘┌┘└┐└┘┌┘└┐┌┘└┐└┘┌┘└┐└┘┌┘└┐┌┘└┐└┘┌┘└┐└┘┌┘└┐┌┘└┐└┘┌┘└┐└┘┌┘└┐
│┌┐│┌┐└┐┌┘┌┐│┌┐││┌┐│┌┐└┐┌┘┌┐│┌┐││┌┐│┌┐└┐┌┘┌┐│┌┐││┌┐│┌┐└┐┌┘┌┐│┌┐│
└┘└┘│└─┘└─┘│└┘└┘└┘└┘│└─┘└─┘│└┘└┘└┘└┘│└─┘└─┘│└┘└┘└┘└┘│└─┘└─┘│└┘└┘
┌┐┌┐│┌─┐┌─┐│┌┐┌┐┌┐┌┐│┌─┐┌─┐│┌┐┌┐┌┐┌┐│┌─┐┌─┐│┌┐┌┐┌┐┌┐│┌─┐┌─┐│┌┐┌┐
│└┘│└┘┌┘└┐└┘│└┘││└┘│└┘┌┘└┐└┘│└┘││└┘│└┘┌┘└┐└┘│└┘││└┘│└┘┌┘└┐└┘│└┘│
└┐┌┘┌┐└┐┌┘┌┐└┐┌┘└┐┌┘┌┐└┐┌┘┌┐└┐┌┘└┐┌┘┌┐└┐┌┘┌┐└┐┌┘└┐┌┘┌┐└┐┌┘┌┐└┐┌┘
┌┘└─┘└─┘└─┘└─┘└┐┌┘└─┘└─┘└─┘└─┘└┐┌┘└─┘└─┘└─┘└─┘└┐┌┘└─┘└─┘└─┘└─┘└┐
│┌─┐┌─┐┌┐┌─┐┌─┐││┌─┐┌─┐┌┐┌─┐┌─┐││┌─┐┌─┐┌┐┌─┐┌─┐││┌─┐┌─┐┌┐┌─┐┌─┐│
└┘┌┘└┐└┘└┘┌┘└┐└┘└┘┌┘└┐└┘└┘┌┘└┐└┘└┘┌┘└┐└┘└┘┌┘└┐└┘└┘┌┘└┐└┘└┘┌┘└┐└┘
┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐┌┐└┐┌┘┌┐
│└─┘└─┘││└─┘└─┘││└─┘└─┘││└─┘└─┘││└─┘└─┘││└─┘└─┘││└─┘└─┘││└─┘└─┘│
└┐┌──┐┌┘└┐┌──┐┌┘└┐┌──┐┌┘└┐┌──┐┌┘└┐┌──┐┌┘└┐┌──┐┌┘└┐┌──┐┌┘└┐┌──┐┌┘
┌┘└┐┌┘└┐┌┘└┐┌┘└┐┌┘└┐┌┘└┐┌┘└┐┌┘└┐┌┘└┐┌┘└┐┌┘└┐┌┘└┐┌┘└┐┌┘└┐┌┘└┐┌┘└┐
│┌┐││┌┐││┌┐││┌┐││┌┐││┌┐││┌┐││┌┐││┌┐││┌┐││┌┐││┌┐││┌┐││┌┐││┌┐││┌┐│
└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘
---
random-booleans
> (loop for el in (random-booleans (* 80 15))
for x from 1
do (princ (if el #\full_block #\space))
(when (zerop (mod x 80)) (fresh-line)))
███ ███ █ █ █ ███ █ ██ █ █ █ ███ █ ██ █ █ █████ █ █
██ ███ ███ █ ███████ █ ███████ ██ ███ ███ ██████ █ ██
█ █ ███ █ █ ██ █ █ ██ ██ █ ███ █ █ ███ ██ ██ ████ ███ █ █ █
██ █ ███ ██ ████ █ █ █ ██ ██ █ █ ██ █████ ███ ██ █ █ ██ █ █ ███ █
███ █ █ ████ ██ █ █ ███ ██ ██ █ █ █ █ ███████████ █ █████
█ ██ ███████ ██ █ █ ██ █ ███ ██ ████ ███████ ████████ █ █ ██ ██ █ █
████ ██ ██ █ ██████ █ █ ██ █ █ ██ █ █ ██ █ █ █ █ █ ████ █ ██ ██
██ ███ ██ █ █ █ ██ ██ ████ ███ █ █ █ ███ ███ █ █ █ ███████
████ ██ █ ██ ███ █ █ █ ██ █ ███████ ██████ █ ████ █ █████ ████
█ █ ███ █ ██ █ █ ██ ███ █ █ █ ███ ██ ███ ██ █ █ █ █████ ███
██ █ ███████ ██ ██ ███ █ ██ █ ████ █ ███████ ██ ████ █ █
██ █ █ ██████ █ █ █ ████ █ ██ ██ ██ █ ███ █ ██ █ █ ████ █ █ ██
█ ███ ██ █ █ █ ██ ██ █ ███ █ ███ ███ █ █ ████ ██ █ ████ █ █ █
██ ██ ██ █ █ █ █ █ █ ██ █ █ ██████ █ █ ██ █ █████ ███ █ █
█ ███ █ ████ ███ █ █ █ ███ █ █ █ ███ ██ ███ █ ██ ██ ██ █ █ ███ █ █
---
help
> (help)
HELP Lisp helps those who help themselves.
PETALS-AROUND-THE-ROSE Play the petals around the rose dice game. Guess the rules.
HILBERT-SPACE-FILLING-CURVE Draw one of Hilbert's continuous fractal space-filling curves.
SHOW-UNICODE-CHARACTERS Show many sets of unicode arrows, dingbats, boxes, i-ching, etc.
---
war
> (war)
A strange game. The only winning move is not to play.
---
life
> (life)
▄▄▄
▄▀ █
▄█▄
▀▀ ▀▀
▄▀▀▀▄
▀▀ ▀▀
▄
▄▀▀▀▄
▀▀ ▀▀
▄▄▄
▄▀▀▀▄
▀▀ ▀▀
▄▀▄
█ █
▀▀ ▀▀
▄█▄
▄█▀ ▀█▄
▀▀ ▀▀
▄▀▀▀▄
█ █
▀▀▀ ▀▀▀
▄
▄███▄
▄█▀ ▀█▄
▀█ █▀
▄▄▄
▄▀ ▀▄
█ ▀ █
▀▄█ █▄▀
▄█▄
▄▀▀▀▀▀▄
▄█▀ ▀█▄
▀▄█ █▄▀
▄▀▀▀▄
▄▄▀▄▄▄▀▄▄
█ ▀ ▀ █
▀▀▄█ █▄▀▀
▄
▄▀█▀▄
▄▄▀▄█▄▀▄▄
▄█ █▀ ▀ ▀█ █▄
▀█▄█ █▄█▀
▄▄▄
▄ ▄
▄ ▀ ▀ ▄
█▀ ▄▀▄ ▀█
▀▄▄ █ █ ▄▄▀
▀ ▀
█
▀▀▀
▄ ▀ ▀ ▄
▄█▀ ▄█▄ ▀█▄
▀▄▄▀█▀ ▀█▀▄▄▀
▀▀ ▀▀
▀█▀
▄▄▄ ▄▄▄
█ ▀ ▀▀▀ ▀ █
▀▀▄▀▀ ▄ ▄ ▀▀▄▀▀
▀▀▀ ▀▀▀
▄
███
▄█▄ ▄ ▄█▄
▄█ ██ █ ██ █▄
▀▀▀▀ ▄ ▄ ▀▀▀▀
▀█ █▀
▄▄▄
▄ ▄
▀▀▀ ▀ ▀ ▀▀▀
█▀ █ ▀▀▀ █ ▀█
▀▀ ▀█ █▀ ▀▀
██▀ ▀██
█
▄ ▀ ▀ ▄
▄▄█▄ ▄▄ ▄▄ ▄█▄▄
▄▀▀ ▄▀ █ ▀▄ ▀▀▄
▀▀ ▄▀▀█ █▀▀▄ ▀▀
█ █ █ █
▄▄▄
▀
▄▄ ▄▄▄▄▄▄▄▄▄▄▄ ▄▄
▄▀▀ ▀█ ▀ ▀ ▀ █▀ ▀▀▄
▀ ▄▄▀ █▀ ▀█ ▀▄▄ ▀
▀▀ ▀▀ ▀▀ ▀▀
▄█▄
▀▀▀
▄▄ ▄▀▀█▀█▀█▀▀▄ ▄▄
█ █ ▄ █ █ █ ▄ █ █
▄▄ ▀ ▀▀ ▀▀ ▀ ▄▄
▀▀▀▀▀ ▀▀▀▀▀
▀▀▀
▄ ▀ ▀ ▄
▄▄▄ █▀▀ ▀ ▀▀█ ▄▄▄
▀ ▀ █ █ █ ▀ ▀
▀██▀ ▀█▀█▀ ▀██▀
▀▀███ ███▀▀
▄
▄▀▄
▄▄ ▄▄▄ ▄▄
▄█▄██ █ █ ██▄█▄
▀▀ █▄ ▄█ ▀▀
▀ ▀ ▄▀▄ ▄▀▄ ▀ ▀
▀ █▀ ▀█ ▀
▀ ▀
▀█▀
▄▄▄██▄██▄▄▄
█▀ █ ▀ █ ▀█
▀▄▄ ▄▄▄ ▄▄▄ ▄▄▀
█▄ █ █ ▄█
██▄ ▄██
▄
▄▀▀▀▄
█ █
▄█▀ ▀ ▄▀▄ ▀ ▀█▄
▀▄ ▄▄▄█ █▄▄▄ ▄▀
▄ ▀ ▀ ▄
▀▄ ▄ ▄ ▄▀
▀ ▀
▄▄▄
███
▄▄█ █▄▄
█▀▀ ▄█▄ ▀▀█
▀▀▀ █▄██ ██▄█ ▀▀▀
▀▀ ▀▀ ▀▀ ▀▀
▀█▄ ▄█▀
▀ ▀
▄▀▄
█▄ ▄█
▄ ▄█▀ ▀ ▀█▄ ▄
▄▀▀ ▀ ▄▀▀▀▄ ▀ ▀▀▄
▀█▄▄ ▀ ▀ ▄▄█▀
▄▀ ▄ ▀ ▀ ▄ ▀▄
█▀█ █▀█
▀▀ ▀▀
▄█▄
▀ ▄ ▀
▄▄ █ ▀ █ ▄▄
▄▀▀ ▀▄▀███▀▄▀ ▀▀▄
██▄▄▄ ▄▄▄██
▄▀ ▄▄ ▄▄ ▀▄
▀█ ▀█ █▀ █▀
▀▀ ▀▀
███
▄ ▄
▄▄ ▄▄ ▄▄ ▄▄
█ ▀ ▀▄▀ ▀▄▀ ▀ █
▀▄ ▄█▄ ▀ ▄█▄ ▄▀
▀ ▄▀▀▄▄ ▄▄▀▀▄ ▀
██ ▄▀ ▀▄ ██
▀▀ ▀▀
▄
█ █
▀ ▀
▄▄ ▄▄▄ ▄▄▄ ▄▄
▄█ ▀ ▀▀▄ ▄▀▀ ▀ █▄
▀█▄█▀▀▄ ▄▀▀█▄█▀
▀▄▄ ▀█▄ ▄█▀ ▄▄▀
▀▄ ▀█▄▀ ▀▄█▀ ▄▀
▀▀▀ ▀▀▀
▄
▄█ █▄
▄▄ ▄▀▄ ▄▀▄ ▄▄
█▀ █▄ ▀ ▀ ▄█ ▀█
▀▄ ▀▀▀█▄ ▄█▀▀▀ ▄▀
▀▄▄██▀ ▀ ▀ ▀██▄▄▀
▀▄▀▀ ▀ ▀ ▀▀▄▀
▀█▀▀ ▀▀█▀
▄
██ ██
▄▄▄ ▄▀ ▀▄ ▄▄▄
▄█▀▄▄ ▀ █ █ ▀ ▄▄▀█▄
▀█ ▀█▀▀▀▀ ▀▀▀▀█▀ █▀
▀█ ▄ ▄ █▀
▀ ▄ ▀ ▄ ▄ ▀ ▄ ▀
██▀ ▀██
▄▄▄
█▄ ▄█
▄▄█ ▄▄ ▄▄ █▄▄
█ ▄▀ ▀ ▀ ▀▄ █
▀▄▄ ▀██▀ ▀██▀ ▄▄▀
▀██ ██▀
▀ ▀ ▀ ▀
▀▄ █ █ ▄▀
---
nuts-and-bolts
Setting up a little database. Starting with the index, DATA-PATH.
> (data-path "foo" :verify nil)
"/emerald-city/academy/data/foo" ;; This will vary depending.
---
group
Pay attention! Another useful utility is being introduced.
GROUP will group the elements of LIST into lists of N elements each.
> (group '(mary joe sue sally sam tom tim) 2)
((MARY JOE) (SUE SALLY) (SAM TOM) (TIM))
---
drawing
> (smile)
▄▀▀▀▀▄
█ ▀ ▀ █
█ ▀▄▄▀ █
▀▄▄▄▄▀
---
visualize-one-in-chance
> (dotimes (x 6) (visualize-one-in-chance (expt 2 x)))
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
████████████████████████████████
██ ▄▀▄▄ █▄▄ ▄▄▄▀███▀█▄▄█ ▄▄█▀▄▀█
▀ ▄█ ▄▄▀█▀ ██▄ ▀▀█▄▄▀ █ ▄ ▄
▄ ██▄ █▄▄▄▄▄ ▀▄ ▄█ ▄▀█▀▄█ █ ▄█
█▀▀██▀▄▀▀▀ ▀█▄█ ▀ █▀▄ █▄█▀▄ ▀▀█
▀ ▀ █▄▀ ▄▀██▀▀ ▄ ▀██ ▀▄██
█▀▄ █▄▄▄▄ ▄ █▀▀▄▀▀ ▄▄▄▀ ▄█▀█▀█
▀▄▀ ▀▀ █▀▄█▀ ▀▀█ ▀ ▀ █▄ █▀
▄▄▄███ ▄ ▄█▄ █▄█ ██▀█ ▄█▀▀▄█▄
██▀▄ ███▀█▄▄█▄ ▀ ▄▀▄▄▀▀▄█ ▄
█▀▄█▀▄▀▄ ▀▄█▀ ▄█▀█▄▀▄▄▀█████▄
▄ ▀█▄ ▄▀▀▀█▀▀▄▀ ▀▄ ███ ▄ ████▀█
▀▀ █▀██▄ ▀▀█▀ ▄▄ ▄ ███▄ ██ ▀
▀▀ ▀█ ▄▄ █ █▄██▀▄▄█ ▀▄██ ▀█ █
█▀▀▄█▀▄ ▄▄▄▀█▄▄ █▀▀▀▄▄█ ▄▀ ▀█▀▄
▄█▀ ▄█▄▀ ▀ ▄ ▀▄███ ▄▄ █▀ ▀█▄
▀ █ █▀█ ▄▄▀▄█▀▄ █▄▄█▀██▀▀█▀▀█
▄ ▀▄ █ ▀ ▀▄ ▀▀▄
▀▀ ▀▄ ▄▄▀ █ ▀ ▄ ▄█▄ ▄ ▄ ▀
▄ █ █▀ ▄▀ ▄▄ ▀▀▀ ▄ ▄ ▄ ▄
▄ ▄ ▀ ▄ ▄ ▀ ▀▄ ▀ ▀ ▀ ▄
▀ ▄▀▀ ▀█ ▄▀ ▀█▄ ▄ ▀
▀▀ ▀ ▀▀█ ██ ▄ ▄▄
▀ ▄▄ ▄ ▀ ▄ ▄▄ ▀ ▀ ▀▀▄
█ ▄ ▄ ▀▄ ▄▄ ▀ ▄▀ ▀
▄▀ ▄ ▀▄█ ▀▀▄ ▄▀▀ ▀▀ ██
▄ █▄█ ▄ ▀ █ ▄█ ▀██ ▄ ▀ ▄▄▀
█▀ ▄ ▄ ▀ ▀▀▀▄ ▄
▀▀ ▀▄ ▀▄ ▀ ▀ ▀ ▀ ▄
█ ▄▀ ▄▀ ▄ ▀ ▄ ▄▀ ▄█ ▀
▀ ▀▀ ▄ ▄ █ ▄ ▀▄ █
▀ ██ ▄ ▄▄ ▄ ▀ ▀
▀ ▀ █ ▄ ▄ ▀ ▀
▀ ▀▀ ▄ ▄█ ▄
▀ ▄ ▄
▄ ▄ ▄ ▀ ▄ ▀ ▄
▀ ▄ █ ▀▄▄ ▄
▄ ▀ ▄▄ ▄ ▀ ▀
▀ ▀ ▀ ▄
▄ ▄▄ ▄ ▀▄ ▀ ▀ ▄
▀ ▀ ▀ ▀ ▄▀ ▄ ▄
▄▀ ▀ ▀▄▀ ▄▄
▀▄ ▀ ▄▀ ▀ ▄ ▄ ▄▀ ▄▀
█▀▀▀▄ ▄ ▄ ▄
█ ▀ ▄▄ ▄ ▄
▄ ▀▄ ▀ ▄ ▀▄ ▀ ▀ ▄▄
▀▄▀ ▀ ▄█ ▀▄ ▀ █ ▀
▄ ▄ ▄ ▀ ▄█▀ ▀ ▀
▀ ▄ █ ▀ ▄ ▄
▀ ▀▀ ▄ ▄
█ ▀ █▀ ▀ ▀
▀ ▀
▄ ▄ ▄ ▀ ▀ ▀
▀▀ ▀ ▀ ▄ ▀ ▀▄
▀ ▀
▀▀ ▄ ▀ ▄ ▀ ▀
▀▀ ▄ ▄
▀ ▄▀ ▀ ▄
▀▀ ▄ ▀ ▄
▄ ▄ ▄ ▄
▀ ▀▀ ▀ ▄ ▀▄
▄ ▄
▀ ▄ ▄ ▄
▀ ▄ ▄ ▀
▀ ▀
▀ ▀
▄ ▄ ▄
▀ ▄ ▄▀
▄ ▀
▄ ▀ ▀ ▀
▀ ▀
▀ ▄
▄ ▀
▄
▄
▄
---
visualize-chance
> (visualize-chance)
█▄██████████▀█▄██ ▄██▄█▀███▄▀▄▀▄█▀▄ ▄▄█▄█▄▄▄█▄█ ▄▀▄ ▀ █ █ ▄
█████████▀▀▄██▀▀▄██▀▀▄███▀██▀▄▄▀▀▀▄▄▀ █▀▀▀▀▀▄▀█▀ ▀ █ ▀▀▀▄ ▄▄ ▄ ▄ ▀▀
███▀██████▀███████▄████▄██▄███▄▀▀ ██▄█▀▄█ ▀ ▄ ▄▄ ▀ ▀ ▄ ▀ ▄ ▀
█████████████▄███ █ █ ████▄██ ▀█▄ █▄▀ █▀█ ▄ ▄▄▄█ ▀▄▄█▄
█████████████▄███████▄██ ▀█ ▄▀ ▄█▀▀▀███▄█▀▄▄▄▄▄ ▄ ▀ ▀ ▀█ ▄▄ ▄
████████▄▀██████▀████▄▀▀ ▄▀█████ ▄█▄▄▀▄█▀ ▀▀██▄▀██ ▀▀▀ ▄ ▀▀ ▄▀ ▄ ▄
████▄████▀▄█▄█▀█████▀▀ ██ █▄ ▀██▄▀█▀█▄▄███▄███▀▄▀▀ ▀ ▄ ▄▀▀▀▀▀ ▄
████████▄▄▄███▀▀ █▄███▀▀█▄▀ █▄▀▀▄ ▀▀▄▀█▄ ▀█▄█ ▄ ▀▄ ▄▀ ▄▄ ▀ ▀ █▀ ▀▄ ▀▄
█████▄███▀██▄▀██▀▄██▀███ ▀██▄█▀█▄█▄█▀█▀▀▀ ▄▄▄▀▀ █ ▀ ▄▀ ▄ ▄▄▄ ▀
██████████ ███▀███ ████ ███▀▀█▀▄▀█▀ █▄▄▀███ ▄█▀▄▀▄▄ ▄ ▀ ▀▄ ▀
███████████████▀▀▀███ █▀ ▀███▄██▄█▀ ███▄▄▀ █ ▄▀▄ ▀ ▄▀ ▄▄ ▄ ▀ ▄
███████████▀███▀█ ▄█▄▀▄██▄██ █▄██▄▀█▀ ██▀ ▄▄ ▀█ ▄ ▄ ▄ ▀ ▄ ▀ ▀▄ ▀
██████████████████▀█▄▄█▀▄█▀█ ▀█ ▀▄▄▄▄█▄▄▀▀ ▄ ▄▄█▀ ▄▄ ▀ ▄█▄ ▀ ▀ ▀
███████████▀██▄█ ▄█▄█▀██▄███████ ▀ ▄█ █▄█▀▀▀█ ██▄ ▀▄▀ ▄ █ ▄▀▀ ▀▄
███████ ███▄████████ █▀▀▀█▄█▄██▄▀▄▄ ███▄▀█ ▄▄█▄ ▄▄ █▄▀ ▄ ▀
██████▄███▀▄█████▄██▀ ▄███ █▀▄█▄█▀█▄▀█▀▀▀▄█ ▄▄▀ ▀▀▀▄▄▄▀ ▄▀ ▄ ▀
---
cellular-automata
> (draw-cellular-automata)
▄█▄
▄█▀▄▄█▄
▄█▀▄▄█▄ ▄█▄
▄█▀▄▄█▄ ▄█▄▄█▄
▄█▀▄▄█▄ ▄█▀▀▄ ▄█▄
▄█▀▄▄█▄ ▄█ █▀▀▀ █▀▄▄█▄
▄█▀▄▄█▄ ▄█▀▀▄▄█▀▄▄█▀ █▄ ▄█▄
▄█▀▄▄█▄ ▄█ █▀▀▄ ▄█▄▄█▀▀▄▄█▄▄█▄
▄█▀▄▄█▄ ▄█▀▀▄▄█▀▀▀ █▄ ▄█▀▀▄ ▄█▄
▄█▀▄▄█▄ ▄█ █▀▀▄▄█▄▄█▀ █▀▀ █▀▀▀▄▄█▀▄▄█▄
▄█▀▄▄█▄ ▄█▀▀▄▄█▀▀▀▄ ▄█▀▀▀ █▀▀ █▀▄ ▄█▄ ▄█▄
▄█▀▄▄█▄ ▄█ █▀▀▄▄█ █▀▀ █▀ █▄▄█▀▀ █▀ █ █▄ ▄█▄▄█▄
▄█▀▄▄█▄ ▄█▀▀▄▄█▀▀▀▄ ▄█▀ █▀▀▀▀▄ ▄█ █▀▀▀▀ █▄▄█▄ ▄█▄
▄█▀▄▄█▄ ▄█ █▀▀▄▄█ █▀ █ █▀▀▀▄▄█▀ █▄▄█▀▄ ▄█▀▄ ▄█ █▀▄▄█▄
▄█▀▄▄█▄ ▄█▀▀▄▄█▀▀▀▄ ▄█▀▀▀ █▀ █▀▄▄█▀▀▄ ▄█ █▄▄█▀▀▀▄▄█ █▄ ▄█▄
▄█▀▄▄█▄ ▄█ █▀▀▄▄█ █▀ █ █▄▄█▀▀▀▀ █▄▄█▀▀▀▀▀▄▄█▄ ▄█ █▀▄ ▄█▄▄█▄▄█
█▄▄█▄ ▄█▀▀▄▄█▀▀▀▄ ▄█▀▀▀ █▄ ▄█▄ ▄█▀▄ ▄█▄ ▄█▀▄ ▄█▄▄█ █ █▄
█▄ ▄█ █▀▀▄▄█ █▀ █ █▄▄█▀▄▄█▄ ▄█▄▄█ █▄ ▄█▄▄█▀▀▀▄ ▄█ █ █▄
█ █ █▀▄▄█▀▀▀▄ ▄█▀▀▀ █▄ ▄█▄ ▄█▄ ▄█▄▄█▄ ▄█ █▀▀ █▀▄▄█ █ █▄
█ █ █ █▄▄█ █▀ █ █▄▄█▀ █▀▀▄▄█▀▀▄▄█ █▀▄ ▄█▀▀▄▄█▀ █▀ █▄ ▄█ █ █▄
█ █ █ █▄ ▄█▀▀▀ █▄ ▄█▀▀▀▀▀▄▄█▀▀▄ ▄█ █▀ █▀ █▀▀▄▄█▀▀▀▀▀▄▄█▄▄█ █▄
█ █ █ █ █▀▀ █▄▄█▀▄▄█ █▄ ▄█▀▄▄█▀▀ █▄▄█▀▀▀▀▀▀▀▀▀▄▄█▄ ▄█▀▄ ▄█▄
█ █ █ █ █▀ █▀▄ ▄█▄ ▄█▄▄█▄▄█▄▄█ █▀▄ ▄█▄ ▄█▀▄ ▄█▄▄█▀▄▄█▀▄
█ █ █ █ █▀▀▀ █▀▀▀▄ ▄█▄ ▄█ █ █▄▄█▄ ▄█▀▄▄█▀▀▀▄ ▄█▄ ▄█▀
█ █ █ █ █▀▄▄█▀▀ █▀ █▄▄█▄ ▄█▀▄▄█ █▄ ▄█▄▄█▄▄█ █▀▀ █▀▄ ▄█ █
█ █ █ █ █ █▄▄█ █▀▀▀▀▄ ▄█▄ ▄█▀▄▄█▄ ▄█ █ █▀▄ ▄█▀ █▀ █ █▄▄█
█ █ █ █ █ █▄ ▄█▀▄▄█▀▀▀▀▄ ▄█▄▄█▄ ▄█▄▄█ █ █▀▄ ▄█▀ █▀▀▀▀▀ █▄
█ █ █ █ █ █ █▀▀▄▄█▄▄█▄▄█▀ █▄ ▄█▀▀▄ ▄█ █ █▀▀▀ █▀▀▀▄ ▄█▀ █▄
█ █ █ █ █ █ █▀▀▀▄ ▄█▀▀ █ █▀ █▀▀▀ █▀▄▄█ █▀▄▄█▀▀ █▀▀▀▀ █▀▀▄
█ █ █ █ █ █ █▀ █▀▀▄ ▄█▀ █ █▀ █▀▀▀▀▄▄█▀ █▄ ▄█ █▄▄█ █▀▀▄ ▄█▀▀▀▀
█ █ █ █ █ █ █▀▀▀▀▀▀▀▀▀ █▀▀ █▀▀▀▀▄▄█▀▄▄█▀▀▄▄█▄▄█▄ ▄█▀▀▀ █ █▄
█ █ █ █ █ █ █▀▄ ▄█▀▀ █▀▀▄▄█▀▄ ▄█▄▄█▀▀▄ ▄█▀▀ █▄▄█▀ █ █▄
> (draw-cellular-automata 110)
▄█
▄█▀█
▄█▀▀▀█
▄█▀█ ▄██
▄█▀▀▀▀▀█▄█
▄█▀█ ▄██▄█
▄█▀▀▀█ ▄██ ▄█
▄█▀█ ▄█▀▀█▄█▄█▀█
▄█▀▀▀▀▀▀█▄██ ▄█▀█
▄█▀█ ▄██ ▄█▄█▀▀▀█
▄█▀▀▀█ ▄██▄█▀█ ▄█ ▄██
▄█▀█ ▄██▄██ ▄█▀▀▀▀▀▀█▄█
▄█▀▀▀▀▀█ ▄█▄█▀█ ▄██▄█
▄█▀█ ▄██ ▄██ ▄█▀█ ▄██ ▄█
▄█▀▀▀█ ▄██▄█▀█▄█▀▀▀▀█▄██▄█▄█▀█
▄█▀█ ▄█▀▀█ ▄█▀█▄█ ▄██ ▄█▀█
█▀▀▀▀▀█▄██▄█▀▀▀█▄█▄██▄█ ▄█▀▀▀█
█ ▄██ ▄█ ▄██ ▄█ ▄█▀█ ▄██
█ ▄██▄█ ▄█▀▀▀█▄█ ▄█▀▀▀▀▀▀▀▀█▄█
█▀█ ▄█▀▀█ ▄██▄█ ▄█▀█ ▄██▄█
█▀█▄█▀█▄█▀▀█ ▄█▀▀▀▀█ ▄██ ▄█
█▀█▄█▀█▄█▄██▄█▀█ ▄██ ▄██▄█▄█▀█
█▀█▄█▀█ ▄█▀█▄██▄█▄██ ▄█▀█
█▀█▄█▀█ ▄█▀▀▀█ ▄█ ▄█▀▀▀█
█▀█▄█▀█ ▄█▀█ ▄██ ▄█▀█▄█▀█ ▄██
█▀█▄█▀▀▀▀▀▀▀▀█▄█ ▄█▀▀▀█▄█▀▀▀█▄█
█▀█▄█ ▄██▄█▄█▀█ ▄██▄█ ▄██▄█
█▀█▄█ ▄██ ▄█▀▀▀█ ▄█▀█ ▄█
█▀█▄█ ▄██▄█ ▄█▀█ ▄██▄█▀▀▀█▄█▀█
█▀█▄█▄██ ▄█▄█▀▀▀▀▀█ ▄█ ▄██▄█▀█
█▀█ ▄█▄██ ▄█ ▄██▄█▀▀▀█ ▄█▀█
█▀█ ▄██ ▄█▀▀█ ▄██ ▄█ ▄██▄█▀▀▀█
> (draw-cellular-automata 102)
▄█
▄█▄█
▄█ ▄█
▄█▄█▄█▄█
▄█ ▄█
▄█▄█ ▄█▄█
▄█ ▄█ ▄█ ▄█
▄█▄█▄█▄█▄█▄█▄█▄█
▄█ ▄█
▄█▄█ ▄█▄█
▄█ ▄█ ▄█ ▄█
▄█▄█▄█▄█ ▄█▄█▄█▄█
▄█ ▄█ ▄█ ▄█
▄█▄█ ▄█▄█ ▄█▄█ ▄█▄█
▄█ ▄█ ▄█ ▄█ ▄█ ▄█ ▄█ ▄█
▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█
▄█
▄█▄█
▄█ ▄█
▄█▄█▄█▄█
▄█ ▄█
▄█▄█ ▄█▄█
▄█ ▄█ ▄█ ▄█
▄█▄█▄█▄█▄█▄█▄█▄█
▄█ ▄█
▄█▄█ ▄█▄█
▄█ ▄█ ▄█ ▄█
▄█▄█▄█▄█ ▄█▄█▄█▄█
▄█ ▄█ ▄█ ▄█
▄█▄█ ▄█▄█ ▄█▄█ ▄█▄█
▄█ ▄█ ▄█ ▄█ ▄█ ▄█ ▄█ ▄█
▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█▄█
---
plot-function
> (visualize-math-functions)
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ ▄▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▀ █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ █
█ █
█ ▄▄▄▀▀▀▄▄▄ █
█ ▄▄▀▀ ▀▀▄▄ █
█ ▄▀ ▀▄ █
█ ▄▀ ▀▄ █
█ ▄▀ ▀▄█
█▄ ▄▀▀ █
█ ▀▄ ▄▀ █
█ ▀▄ ▄▀ █
█ ▀▄ ▄▀ █
█ ▀▀▄▄ ▄▄▀▀ █
█ ▀▀▀▄▄▄▀▀▀ █
█ █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ █
█ █
█ ▄▄▄▀▀▀▄▄▄ █
█ ▄▄▀▀ ▀▀▄▄ █
█ ▄▀ ▀▄ █
█ ▄▀ ▀▄ █
█ ▄▀ ▀▄ █
█ ▄▀▀ ▀▄▄ █
█ ▄▀ ▀▄ █
█ ▄▀ ▀▄ █
█ ▄▀ ▀▄ █
█ ▄▄▀▀ ▀▀▄▄ █
█▄▀▀▀ ▀▀▀█
█ █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
█▀▀▀▀▀▀▀▀▀█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ █
█ ▀ ▀ █
█ ▀ ▀ █
█ ▀ ▀ █
█ ▄▀ ▄▀ █
█ ▄▀ ▄▀ █
█▄▀ ▄▀ █
█ ▀ █
█ ▄▀ ▄█
█ ▄▀ ▄▀ █
█ ▄▀ ▄▀ █
█ ▄ ▄ █
█ ▄ ▄ █
█ ▄ ▄ █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ █
█ ▄▄▄▄▄▀▀▀▀▀▀█
█ ▄▄▄▀▀▀▀ █
█ ▄▄▀▀ █
█ ▄▀▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▀▀ █
█ ▄▀ █
█ ▄▀ █
█ ▄▄▀ █
█ ▄▄▀▀ █
█ ▄▄▄▄▀▀▀ █
█▄▄▄▄▄▄▄▀▀▀▀▀ █
█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄█
---
slurp-file
Pay attention! Another useful utility is being shown here.
"Slurping" refers to loading an entire file into memory at one call.
> (slurp-file "/etc/passwd")
"root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
...
prince:1000:1000:♃ ,,,:/home/prince:/bin/csh
"
---
i-ching
> (i-ching t)
☰ heaven
☰ heaven
䷀ 1 Ch'ien / The Creative
☱ lake
☵ water
䷮ 47 K'un / Oppression (Exhaustion)
> (hexagram-text 1)
1. Ch'ien / The Creative
--------
-------- above Ch'ien The Creative, Heaven
--------
--------
-------- below Ch'ien The Creative, Heaven
--------
The Judgement
The Creative works sublime success,
Furthering through perseverance.
The Image
The movement of heaven is full of power.
Thus the superior man makes himself strong and untiring.
The Lines
Nine at the beginning means:
Hidden dragon. Do not act.
Nine in the second place means:
Dragon appearing in the field.
It furthers one to see the great man.
Nine in the third place means:
All day long the superior man is creatively active.
At nightfall his mind is beset with cares.
Danger. No blame.
Nine in the fourth place means:
Wavering flight over the depths.
No blame.
() Nine in the fifth place means:
Flying dragon in the heavens.
It furthers one to see the great man.
Nine at the top means:
Arrogant dragon will have cause to repent.
When all the lines are nines, it means:
There appears a flight of dragons without heads.
Good fortune.
---
eval-in-emacs
For emacs users only. Enabling them to execute code in the slime
connected emacs from the lisp.
> (eval-in-emacs '(version))
"GNU Emacs 23.2.1 (x86_64-pc-linux-gnu, GTK+ Version 2.20.1)
of 2010-12-11 on brahms, modified by Debian"
> (eval-in-emacs '(+ 1 2 3))
6
Useful for opening the editor on exising or new files.
> (eval-in-emacs '(progn (find-file "/tmp/foo123") nil))
NIL
Note that for EVAL-IN-EMACS to work you need to enable in
emacs, generally in the ~/.emacs file:
(setq slime-enable-evaluate-in-emacs t)
---
draw-circle
> (bullseye)
▄▄▄▄▀▀▀▀▀▀▀▀▀▀▀▄▄▄▄
▄▄▄▀▀ ▀▀▄▄▄
▄▄▀ ▄▄▄▀▀▀▀▀▀▀▀▀▀▀▄▄▄ ▀▄▄
▄▀ ▄▄▀▀▀ ▀▀▀▄▄ ▀▄
▄▀ ▄▀ ▄▄▄▀▀▀▀▀▀▀▀▀▄▄▄ ▀▄ ▀▄
▄▀ ▄▀▀ ▄▀▀▀ ▀▀▀▄ ▀▀▄ ▀▄
▄▀ ▄▀ ▄▀▀ ▄▄▄▀▀▀▀▀▀▀▀▀▄▄▄ ▀▀▄ ▀▄ ▀▄
▄▀ ▄▀ ▄▀ ▄▀▀ ▀▀▄ ▀▄ ▀▄ ▀▄
█ ▄▀ ▄▀ ▄▀ ▄▄▄▀▀▀▀▀▀▀▄▄▄ ▀▄ ▀▄ ▀▄ █
▄▀ ▄▀ ▄▀ ▄▀ ▄▄▀ ▀▄▄ ▀▄ ▀▄ ▀▄ ▀▄
▄▀ █ █ ▄▀ ▄▀ ▄▄▀▀▀▀▀▀▀▄▄ ▀▄ ▀▄ █ █ ▀▄
█ █ ▄▀ ▄▀ ▄▀ ▄▀ ▀▄ ▀▄ ▀▄ ▀▄ █ █
▄▀ ▄▀ █ █ █ ▄▀ ▄▀▀▀▀▀▄ ▀▄ █ █ █ ▀▄ ▀▄
█ █ █ █ ▄▀ ▄▀ ▄▀ ▀▄ ▀▄ ▀▄ █ █ █ █
█ █ █ █ █ █ █ ▄▀▀▀▄ █ █ █ █ █ █ █
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
█ █ █ █ █ █ ▀▄ ▀▀▀ ▄▀ █ █ █ █ █ █
█ █ ▀▄ ▀▄ █ █ ▀▄ ▄▀ █ █ ▄▀ ▄▀ █ █
█ █ █ █ ▀▄ ▀▄ ▀▀▀▀▀ ▄▀ ▄▀ █ █ █ █
█ ▀▄ █ █ █ ▀▄▄ ▄▄▀ █ █ █ ▄▀ █
█ █ ▀▄ ▀▄ ▀▄▄ ▀▀▀▀▀▀▀ ▄▄▀ ▄▀ ▄▀ █ █
█ █ █ ▀▄ ▀▄▄▄ ▄▄▄▀ ▄▀ █ █ █
▀▄ ▀▄ ▀▄ ▀▄ ▀▀▀▀▀▀▀ ▄▀ ▄▀ ▄▀ ▄▀
█ █ ▀▄ ▀▀▄▄▄ ▄▄▄▀▀ ▄▀ █ █
▀▄ ▀▄ ▀▀▄ ▀▀▀▀▀▀▀▀▀ ▄▀▀ ▄▀ ▄▀
▀▄ ▀▀▄ ▀▀▀▄▄▄ ▄▄▄▀▀▀ ▄▀▀ ▄▀
▀▄ ▀▄▄ ▀▀▀▀▀▀▀▀▀ ▄▄▀ ▄▀
▀▄▄ ▀▀▀▄▄▄ ▄▄▄▀▀▀ ▄▄▀
▀▄▄▄ ▀▀▀▀▀▀▀▀▀▀▀ ▄▄▄▀
▀▀▄▄▄▄ ▄▄▄▄▀▀
▀▀▀▀▀▀▀▀▀▀▀
---
draw-line
> (sunbeam)
█ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀
█ █ █ ▄▀ █ █ ▄▀ ▄▀ ▄▀
█ █ █ █ █ ▄▀ █ ▄▀ ▄▀
█ █ █ █ █ ▄▀ ▄▀ ▄▀ ▄▀
█ █ █ █ █ █ █ █ ▄▀ ▄▀▀
█ █ █ ▄▀ █ █ ▄▀ ▄▀ ▄▀ ▄▀
█ █ █ █ █ ▄▀ █ ▄▀ ▄▀ ▄▀
█ █ █ █ █ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀▀
█ █ █ █ █ █ █ ▄▀ ▄▀ ▄▀ ▄▀▀
█ █ █ ▄▀ █ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀▀
█ █ █ █ █ ▄▀ █ ▄▀ ▄▀ ▄▄▀ ▄▄▀
█ █ █ █ █ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀
█ █ █ █ █ █ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀▀ ▄▄▀▀
█ █ █ ▄▀ █ ▄▀ ▄▀ █ ▄▀ ▄▀ ▄▄▀ ▄▄▀
█ █ █ ▄▀ █ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀▀ ▄▀ ▄▀▀
█ █ █ █ █ █ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀▀ ▄▀▀
█ █ █ █ █ █ ▄▀ ▄▀ ▄▀ ▄▀ ▄▄▀ ▄▄▀▀ ▄▄▀▀▀
█ █ █ ▄▀ █ ▄▀ ▄▀ ▄▀ ▄▀ ▄▄▀ ▄▀ ▄▄▀ ▄▄▀▀
█ █ █ ▄▀ █ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀▀ ▄▄▀ ▄▄▀▀
█ █ █ █ █ █ ▄▀ ▄▀ ▄▀ ▄▀ ▄▄▀ ▄▀▀ ▄▄▀▀
█ █ █ █ █ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀ ▄▀ ▄▄▀▀ ▄▄▀▀ ▄▄▄▀▀▀
█ █ █ ▄▀ █ ▄▀ ▄▀▄▀ ▄▀▄▀▀ ▄▀▀ ▄▄▀ ▄▄▀▀ ▄▄▀▀▀
█ █ █ ▄▀ █ ▄▀▄▀ █ ▄▀▄▀ ▄▄▀ ▄▄▀ ▄▄▀▀ ▄▄▄▀▀▀
█ █ █ █ █ █ █ ▄▀▄▀▄▀ ▄▀ ▄▀▀ ▄▄▀▀ ▄▄▀▀▀
██ █ █ █▄▀▄▀▄▀▄█▄▀▄▀▀ ▄▀▀ ▄▄▀▀ ▄▄▄▀▀▀ ▄▄▄▄▀▀▀▀▀
██ ██ █▄▀█▄▀▄█▀▄▄▀▄▄▀▀ ▄▄▀▀ ▄▄▀▀▀ ▄▄▄▄▀▀▀▀
███▄▀██▄█▀▄█▀▄▀▄▄▀ ▄▄▀▀ ▄▄▄▀▀▀ ▄▄▄▄▄▀▀▀▀
███████▄███▀█▀▀▄▄▀▀ ▄▄▀▀▀ ▄▄▄▄▀▀▀▀
██████████▀█▄▀█▄▄▀▀▀ ▄▄▄▄▀▀▀▀ ▄▄▄▄▄▄▄▄▄▀▀▀▀▀▀▀▀▀
███████████▀▀█▄▄▄▀▀▀▀▀ ▄▄▄▄▄▄▄▄▄▀▀▀▀▀▀▀▀▀
█████████▀███▄▄▄▄▄▄▀▀▀▀▀▀▀▀▀
██████████▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
---
remember
A simple notebook of very special super secret important things to
entrust to the well-being and safe-keeping of a machine.
> (remember "I think,")
Noted.
> (remember "therefore")
Noted.
> (remember "I am.")
Noted.
> (remember)
I think,
therefore
I am.
---
fill-bitmap
> (sun)
▄▄▄▄▄▄▄▄▄▄▄
▄▄▄███████████████████▄▄▄
▄▄█████████████████████████████▄▄
▄███████████████████████████████████▄
▄█████████████████████████████████████████▄
▄█████████████████████████████████████████████▄
█████████████████████████████████████████████████
▄███████████████████████████████████████████████████▄
███████████████████████████████████████████████████████
█████████████████████████████████████████████████████████
███████████████████████████████████████████████████████████
▄███████████████████████████████████████████████████████████▄
█████████████████████████████████████████████████████████████
▄█████████████████████████████████████████████████████████████▄
███████████████████████████████████████████████████████████████
███████████████████████████████████████████████████████████████
███████████████████████████████████████████████████████████████
███████████████████████████████████████████████████████████████
███████████████████████████████████████████████████████████████
█████████████████████████████████████████████████████████████
█████████████████████████████████████████████████████████████
███████████████████████████████████████████████████████████
▀█████████████████████████████████████████████████████████▀
▀███████████████████████████████████████████████████████▀
▀█████████████████████████████████████████████████████▀
▀█████████████████████████████████████████████████▀
▀███████████████████████████████████████████████▀
▀███████████████████████████████████████████▀
▀▀█████████████████████████████████████▀▀
▀█████████████████████████████████▀
▀▀█████████████████████████▀▀
▀▀▀▀███████████▀▀▀▀
---
print-table
> (loop for args in '((:align :right) (:gap "$$") nil)
do (apply #'print-table
(loop for x from 1 to 6
collect
(loop for x from 1 to 6
collect (random-do (random 100000)
(random-element '(bull bear)))))
args)
(terpri))
BEAR BEAR BULL BULL 87984 84947
BEAR 69563 44895 29735 BEAR 85831
72832 BULL BULL 77389 82439 86364
BULL BULL BEAR BULL BULL BULL
BULL BEAR BEAR 73444 BEAR 43194
87523 33990 24603 BEAR 63915 BULL
BEAR$$67880$$64999$$ BEAR$$66444$$88571
29536$$ BEAR$$28664$$ BEAR$$96143$$ BULL
BEAR$$70373$$82057$$85997$$99603$$ 3351
47959$$ BEAR$$ BEAR$$73129$$ 8184$$ BULL
43649$$97104$$ BEAR$$ BEAR$$ BULL$$ BULL
BULL$$ BULL$$ BEAR$$68957$$ BEAR$$ BEAR
65931 8108 72867 BULL 68808 34300
7998 87740 BEAR BULL BEAR 15545
55447 86670 BEAR BULL BULL BULL
79437 BEAR BEAR 43880 23451 BEAR
BULL 9323 75928 52182 BEAR 2799
BEAR 80488 BULL 65464 BULL 58910
Ugly, ain't it!
---
multiplication-table
> (multiplication-table)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48
4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64
5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80
6 12 18 24 30 36 42 48 54 60 66 72 78 84 90 96
7 14 21 28 35 42 49 56 63 70 77 84 91 98 105 112
8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128
9 18 27 36 45 54 63 72 81 90 99 108 117 126 135 144
10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160
11 22 33 44 55 66 77 88 99 110 121 132 143 154 165 176
12 24 36 48 60 72 84 96 108 120 132 144 156 168 180 192
13 26 39 52 65 78 91 104 117 130 143 156 169 182 195 208
14 28 42 56 70 84 98 112 126 140 154 168 182 196 210 224
15 30 45 60 75 90 105 120 135 150 165 180 195 210 225 240
16 32 48 64 80 96 112 128 144 160 176 192 208 224 240 256
---
bullseye
> (bullseye :filled t)
▄▄▄▄███████████▄▄▄▄
▄▄▄███████████████████████▄▄▄
▄▄██████████▀▀▀▀▀▀▀▀▀▀▀██████████▄▄
▄███████▀▀▀ ▀▀▀███████▄
▄██████▀ ▄▄▄█████████▄▄▄ ▀██████▄
▄█████▀▀ ▄█████████████████████▄ ▀▀█████▄
▄█████▀ ▄█████████▀▀▀▀▀▀▀▀▀█████████▄ ▀█████▄
▄█████▀ ▄██████▀▀ ▀▀██████▄ ▀█████▄
█████▀ ▄██████▀ ▄▄▄███████▄▄▄ ▀██████▄ ▀█████
▄████▀ ▄█████▀ ▄▄███████████████▄▄ ▀█████▄ ▀████▄
▄█████ █████▀ ▄███████▀▀▀▀▀▀▀███████▄ ▀█████ █████▄
█████ ▄████▀ ▄█████▀ ▀█████▄ ▀████▄ █████
▄████▀ █████ █████▀ ▄█████▄ ▀█████ █████ ▀████▄
█████ █████ ▄████▀ ▄█████████▄ ▀████▄ █████ █████
█████ █████ █████ █████▀▀▀█████ █████ █████ █████
█████ █████ █████ █████ █████ █████ █████ █████
█████ █████ █████ ▀███████████▀ █████ █████ █████
█████ ▀████▄ █████ ▀███████▀ █████ ▄████▀ █████
█████ █████ ▀█████▄ ▀▀▀▀▀ ▄█████▀ █████ █████
█████▄ █████ ██████▄▄ ▄▄██████ █████ ▄█████
█████ ▀█████▄ ▀███████████████████▀ ▄█████▀ █████
█████ ██████▄ ▀█████████████▀ ▄██████ █████
▀█████▄ ▀██████▄ ▀▀▀▀▀▀▀ ▄██████▀ ▄█████▀
██████ ▀███████▄▄▄ ▄▄▄███████▀ ██████
▀█████▄ ▀▀███████████████████████▀▀ ▄█████▀
▀██████▄ ▀▀▀███████████████▀▀▀ ▄██████▀
▀██████▄▄ ▀▀▀▀▀▀▀▀▀ ▄▄██████▀
▀█████████▄▄▄ ▄▄▄█████████▀
▀█████████████████████████████▀
▀▀███████████████████▀▀
▀▀▀▀▀▀▀▀▀▀▀
---
peace
> (peace)
▄▄▄▄▄
▄▀ █ ▀▄
█ █ █
█ ▄█▄ █
▀▄▄▀ █ ▀▄▄▀
▀▄▄█▄▄▀
---
turtle-graphics
> (turtle-race)
squares
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█
█ █
█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█ █
█ █ █
█▀▀▀▀▀▀▀▀▀▀▀▀▀█ █ █
█ █ █ █
█▀▀▀▀▀▀▀▀▀█ █ █ █
█ █ █ █ █
█▀▀▀▀▀█ █ █ █ █
█ █ █ █ █ █
█▀█ █ █ █ █ █
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
squares-rotated
▄
▄▀▀▄
▄▀▄ ▀▄
▄▀ ▀▄ ▀▄
▄▀ ▀▄ ▀▄ ▀▄
▄▀▄ ▀▄ ▀▄ ▀▄
▄█ ▀▄ ▀▄ ▀▄ ▀▄
▀▄▀▀ ▄▀ ▄▀ ▄▀ ▄▀
▀▄ ▄▀ ▄▀ ▄▀ ▄▀
▀▄ ▄▀ ▄▀ ▄▀
▀▄▀ ▄▀ ▄▀
▀▄ ▄▀ ▄▀
▀▄ ▄▀
▀█
triangle
█▀▄▄
█ ▀▀▄
█ ▀▀▄▄
█ ▀▀▄
█ ▀▀▄▄
█ ▀▀▄
█ ▄▄▀▀
█ ▄▀▀
█ ▄▄▀▀
█ ▄▀▀
█ ▄▄▀▀
█▄▀▀
▀
circle
▄▄▀▀▀▀▀▀▀▀▀▀▄▄
▄▀ ▀▄
▄▀ ▀▄
█ █
▄▀ █
█ ▀▄
█ █
█ ▄▀
▀▄ █
█ █
▀▄ ▄▀
▀▀▄ ▄▀▀
▀▀▄▄▄▄▄▄▄▀▀▀
spiral
▄▄▄▄▄▄▄▄▄▄
▄▀ ▀▀▄
▄▀ ▀▀▄
▄▀ ▄▄▀▀▀▀▀▀▀▄▄ █
▄▀ ▄▀ ▀▄ ▀▄
█ █ ▄▄▄▄▄ ▀▄ ▀▄
▄▀ █ ▄▀ ▀▄ █ ▀▄
█ █ █ █ █ ▀
█ █ ▀ █ ▀▄ █
█ ▀▄ ▄▀ █ █
█ ▀▄ ▄█ ▄▀ █
▀▄▄ ▀▀▀▀▄▀▀ ▄█ █
▀▄▄ ▄▀ ▀
▀▄ ▄▀
▀▀▀▀▀▀▀▀
box-spiral
▄▄▄
█ ▀▀▀▄▄
█ ▀▀▀▄▄▄
▄▀ ▄▄▄▄ ▀▀▄▄▄
█ █ ▀▀▀▄▄▄ ▀▀▄▄▄
█ ▄▀ ▀▀▀▄▄▄ ▀▀▀▄▄
▄▀ █ ▄▄▄▄▄ ▀▀▀▀▄▄▄ ▀▀▀▄▄▄
█ █ █ ▀▀▀▀▀▄▄▄▄ ▀▀▀▄▄▄ ▀▀▄▄▄
█ █ █ ▀▀▀▀▀▄▄▄▄▄ ▀▀▀▄▄▄ ▀▀▄
▄▀ █ █ ▄▀▀▀▀▀▀▀▄▄▄▄▄▄▄ ▀▀▀▀▄ ▄▀ █
█ ▄▀ █ █ ▀▀▀▀▀▀▄ █ █ █
█ █ █ █ ▄▄▄▄▄▄▄▄▄▄▄▄ █ ▄▀ █ ▄▀
▄▀ ▄▀ █ ▄▀ █ ▄▀ █ █ ▄▀ ▄▀
█ █ ▄▀ █ █ ▄▄▄▄▄▄ █ ▄▀ ▄▀ █ █
█ █ █ █ █ █ █ █ █ █ █ █
▄▀ ▄▀ ▄▀ ▄▀ █ ▀ █ █ █ ▄▀ ▄▀ █
█ █ █ █ █ █ █ ▄▀ █ █ ▄▀
█ ▄▀ ▄▀ █ ▀▀▀▀▀▀▀▀▀▀ █ █ ▄▀ █ █
▄▀ █ █ █▄▄▄▄▄▄▄▄ █ █ █ ▄▀ █
█ █ █▄▄▄▄ ▀▀▀▀▀▀▀▀█ ▄▀ █ █ █
█ █▄▄▄ ▀▀▀▀▀▄▄▄▄▄ █ █ █ ▄▀
▀▀▀▄▄ ▀▀▀▄▄▄ ▀▀▀▀▄▄▄▄ ▀▀▀▀▀▄▄▄▄█ █ ▄▀ ▄▀
▀▀▀▄▄ ▀▀▀▄▄▄ ▀▀▀▀▄▄▄▄ ▀ █ █ █
▀▀▄▄▄ ▀▀▀▄▄▄ ▀▀▀▀▄▄▄▄ █ █ █
▀▀▄▄ ▀▀▀▄▄▄ ▀▀▀▀█ ▄▀ ▄▀
▀▀▀▄▄ ▀▀▀▄▄▄ █ ▄▀
▀▀▀▄▄ ▀▀▀▄▄▄ █ █
▀▀▄▄▄ ▀▀█ █
▀▀▄▄ █
▀▀▀▄▄ ▄▀
▀▀█
star
█
█▄
█▀▄ ▄▄
█ ▀▄ ▄▀█
█ ▀▄ ▄▀▀ █
█ ▀▄ ▄▀ █
█ ▀▄ ▄▀▀ █
▀▀█▀▀▄▄▄▄ █ ▀▄ ▄▀ █
▀▄▄ ▀▀▀▀▀▄▄▄█ ▄▀█ █
▀▄ █▀▀▀██▄▄█▄ █
▀▄▄ █▄▀▀ ▀█▀▀▀█▄▄▄
▀▄ ▄█ ▀▄ █ ▀▀▀▀▀▄▄▄▄
███ █ ▀█ ████▄
▄▀ ▀█ █▀▄ ▄▄▄▄▄▀▀▀▀
▄▀▀ █▀▄▄ █▄▄██▀▀▀
▄▀ █▄▄▄██▀▀▀█ ▀▄
▄▀▀ ▄▄▄▄▄▀▀▀█ ▀▄█ ▀▄
▄█▄▄▀▀▀▀ █ █ ▀▄ ▀▄
▀ █ █ ▀▄▄ ▀▄
█ █ ▀▄ ▀▄
█ █ ▀▄▄▀▄
█ █ ▀█▄
█ █ ▀▄
██
█
▀
---
asdf-lisp-files
> (mapcar #'pathname-name (asdf-lisp-files :academy))
("packages" "help" "classic-utilities" "pretty-printing" "unicode" "randomness"
"petals-around-the-rose" "math" "hilbert-space-filling-curve" "war" "drawing"
"life" "nuts-and-bolts" "probability" "cellular-automata" "i-ching" "emacs" "remember"
"turtle-graphics" "welcome")
---
sbcl-nuts-and-bolts
> (princ (run-program-to-string "echo" '("Is" "anyone" "out" "there" "?")))
Is anyone out there ?
;;; With the classic bsdgames installed...
> (princ (run-program-to-string "morse" '("code")))
daw dit daw dit
daw daw daw
daw dit dit
dit
> (princ (run-program-to-string "fortune" nil))
You're currently going through a difficult transition period called "Life."
---
with-output-to-data-file
For easily saving printed output of any of the functions.
> (with-output-to-data-file "happy.txt" (smile))
80 bytes written to "/emerald-city/academy/data/happy.txt"
---
git
> (princ (git '("version")))
git version 1.7.2.5
> (princ (git '("count-objects")))
958 objects, 3836 kilobytes
---
log
The entire project log file can now be saved to disk for further
perusal and distribution.
> (save-log)
79934 bytes written to "/emerald-city/academy/data/log.txt"
---
website
Prepare for launch...
10
9
8
7
6
... main engine start ...
5
4
3
2
1
.....liftoff
............booster separation
...................................orbit.
---
collect
> (collect 10 (random 10))
(7 8 9 0 5 7 3 1 2 8)
> (collect 10 (random-booleans 2))
((NIL T) (NIL T) (NIL NIL) (NIL NIL) (T T) (T NIL) (T NIL) (NIL NIL) (T NIL) (NIL NIL))
> (collect (random 10) (random 10))
(4 2)
---
count-unique
> (count-unique (random-booleans 100)) ; Your mileage may vary.
((T 44) (NIL 56))
> (count-unique (random-booleans 100 3))
((T 30) (NIL 70))
> (count-unique (collect 100 (random 10)))
((5 9) (7 15) (8 6) (2 13) (4 15) (0 11) (6 10) (9 10) (3 9) (1 2))
> (reduce #'+ (mapcar #'second *))
100
> (count-unique (collect 20 (random-element '(fe fi fo fum))))
((FO 5) (FI 5) (FE 3) (FUM 7))
---
hall-of-programmers
For a little competitive spirit.
---
contributors.txt
Thanks go out to the following for,
Brit Butler - the shortest solution to the POWER-OF-TWO-P problem
Heow Goodman - PEACE, not high end German automobiles
---
comic-strip
> (with-comic-strip () (life))
▄▄▄ ▄█▄ ▄▀▀▀▄
▄▀ █ ▀▀ ▀▀ ▀▀ ▀▀
▄ ▄▄▄ ▄▀▄
▄▀▀▀▄ ▄▀▀▀▄ █ █
▀▀ ▀▀ ▀▀ ▀▀ ▀▀ ▀▀
▄
▄█▄ ▄▀▀▀▄ ▄███▄
▄█▀ ▀█▄ █ █ ▄█▀ ▀█▄
▀▀ ▀▀ ▀▀▀ ▀▀▀ ▀█ █▀
▄▄▄ ▄█▄ ▄▀▀▀▄
▄▀ ▀▄ ▄▀▀▀▀▀▄ ▄▄▀▄▄▄▀▄▄
█ ▀ █ ▄█▀ ▀█▄ █ ▀ ▀ █
▀▄█ █▄▀ ▀▄█ █▄▀ ▀▀▄█ █▄▀▀
▄ ▄▄▄ █
▄▀█▀▄ ▄ ▄ ▀▀▀
▄▄▀▄█▄▀▄▄ ▄ ▀ ▀ ▄ ▄ ▀ ▀ ▄
▄█ █▀ ▀ ▀█ █▄ █▀ ▄▀▄ ▀█ ▄█▀ ▄█▄ ▀█▄
▀█▄█ █▄█▀ ▀▄▄ █ █ ▄▄▀ ▀▄▄▀█▀ ▀█▀▄▄▀
▀ ▀ ▀▀ ▀▀
▄ ▄▄▄
▀█▀ ███ ▄ ▄
▄▄▄ ▄▄▄ ▄█▄ ▄ ▄█▄ ▀▀▀ ▀ ▀ ▀▀▀
█ ▀ ▀▀▀ ▀ █ ▄█ ██ █ ██ █▄ █▀ █ ▀▀▀ █ ▀█
▀▀▄▀▀ ▄ ▄ ▀▀▄▀▀ ▀▀▀▀ ▄ ▄ ▀▀▀▀ ▀▀ ▀█ █▀ ▀▀
▀▀▀ ▀▀▀ ▀█ █▀ ██▀ ▀██
█ ▄▄▄ ▄█▄
▄ ▀ ▀ ▄ ▀ ▀▀▀
▄▄█▄ ▄▄ ▄▄ ▄█▄▄ ▄▄ ▄▄▄▄▄▄▄▄▄▄▄ ▄▄ ▄▄ ▄▀▀█▀█▀█▀▀▄ ▄▄
▄▀▀ ▄▀ █ ▀▄ ▀▀▄ ▄▀▀ ▀█ ▀ ▀ ▀ █▀ ▀▀▄ █ █ ▄ █ █ █ ▄ █ █
▀▀ ▄▀▀█ █▀▀▄ ▀▀ ▀ ▄▄▀ █▀ ▀█ ▀▄▄ ▀ ▄▄ ▀ ▀▀ ▀▀ ▀ ▄▄
█ █ █ █ ▀▀ ▀▀ ▀▀ ▀▀ ▀▀▀▀▀ ▀▀▀▀▀
▄
▀▀▀ ▄▀▄ ▀█▀
▄ ▀ ▀ ▄ ▄▄ ▄▄▄ ▄▄ ▄▄▄██▄██▄▄▄
▄▄▄ █▀▀ ▀ ▀▀█ ▄▄▄ ▄█▄██ █ █ ██▄█▄ █▀ █ ▀ █ ▀█
▀ ▀ █ █ █ ▀ ▀ ▀▀ █▄ ▄█ ▀▀ ▀▄▄ ▄▄▄ ▄▄▄ ▄▄▀
▀██▀ ▀█▀█▀ ▀██▀ ▀ ▀ ▄▀▄ ▄▀▄ ▀ ▀ █▄ █ █ ▄█
▀▀███ ███▀▀ ▀ █▀ ▀█ ▀ ██▄ ▄██
▀ ▀
▄ ▄▄▄ ▄▀▄
▄▀▀▀▄ ███ █▄ ▄█
█ █ ▄▄█ █▄▄ ▄ ▄█▀ ▀ ▀█▄ ▄
▄█▀ ▀ ▄▀▄ ▀ ▀█▄ █▀▀ ▄█▄ ▀▀█ ▄▀▀ ▀ ▄▀▀▀▄ ▀ ▀▀▄
▀▄ ▄▄▄█ █▄▄▄ ▄▀ ▀▀▀ █▄██ ██▄█ ▀▀▀ ▀█▄▄ ▀ ▀ ▄▄█▀
▄ ▀ ▀ ▄ ▀▀ ▀▀ ▀▀ ▀▀ ▄▀ ▄ ▀ ▀ ▄ ▀▄
▀▄ ▄ ▄ ▄▀ ▀█▄ ▄█▀ █▀█ █▀█
▀ ▀ ▀ ▀ ▀▀ ▀▀
▄
▄█▄ ███ █ █
▀ ▄ ▀ ▄ ▄ ▀ ▀
▄▄ █ ▀ █ ▄▄ ▄▄ ▄▄ ▄▄ ▄▄ ▄▄ ▄▄▄ ▄▄▄ ▄▄
▄▀▀ ▀▄▀███▀▄▀ ▀▀▄ █ ▀ ▀▄▀ ▀▄▀ ▀ █ ▄█ ▀ ▀▀▄ ▄▀▀ ▀ █▄
██▄▄▄ ▄▄▄██ ▀▄ ▄█▄ ▀ ▄█▄ ▄▀ ▀█▄█▀▀▄ ▄▀▀█▄█▀
▄▀ ▄▄ ▄▄ ▀▄ ▀ ▄▀▀▄▄ ▄▄▀▀▄ ▀ ▀▄▄ ▀█▄ ▄█▀ ▄▄▀
▀█ ▀█ █▀ █▀ ██ ▄▀ ▀▄ ██ ▀▄ ▀█▄▀ ▀▄█▀ ▄▀
▀▀ ▀▀ ▀▀ ▀▀ ▀▀▀ ▀▀▀
▄ ▄ ▄▄▄
▄█ █▄ ██ ██ █▄ ▄█
▄▄ ▄▀▄ ▄▀▄ ▄▄ ▄▄▄ ▄▀ ▀▄ ▄▄▄ ▄▄█ ▄▄ ▄▄ █▄▄
█▀ █▄ ▀ ▀ ▄█ ▀█ ▄█▀▄▄ ▀ █ █ ▀ ▄▄▀█▄ █ ▄▀ ▀ ▀ ▀▄ █
▀▄ ▀▀▀█▄ ▄█▀▀▀ ▄▀ ▀█ ▀█▀▀▀▀ ▀▀▀▀█▀ █▀ ▀▄▄ ▀██▀ ▀██▀ ▄▄▀
▀▄▄██▀ ▀ ▀ ▀██▄▄▀ ▀█ ▄ ▄ █▀ ▀██ ██▀
▀▄▀▀ ▀ ▀ ▀▀▄▀ ▀ ▄ ▀ ▄ ▄ ▀ ▄ ▀ ▀ ▀ ▀ ▀
▀█▀▀ ▀▀█▀ ██▀ ▀██ ▀▄ █ █ ▄▀
---
input
> (read-from-keyboard)
⌨ Hello!
"Hello!"
> (read-number-from-keyboard)
Please enter a number.
⌨ Peachy!
Invalid entry. Please try again.
⌨ 42
42
---
braille
> (print-in-braille "Hello, how are you? I wish you the best.")
⠓⠑⠇⠇⠕⠠⠀⠓⠕⠺⠀⠁⠗⠑⠀⠽⠕⠥⠹⠀⠊⠀⠺⠊⠎⠓⠀⠽⠕⠥⠀⠞⠓⠑⠀⠃⠑⠎⠞⠨
---
secrets
> (cesear-cypher)
Enter your message.
⌨ Beware the Ides of March.
"hkcgxk znk ojky ul sgxin."
20
> (cesear-cypher * 20)
"beware the ides of march."
6
> (caesar-cypher *greeting*)
"hvs wrsg ct aofqv vojs qcas."
12
> (values (caesar-cypher *response*))
"xv, zxbpxo, yrq klq dlkb."
---
print-heading
> (print-heading " In the beginning...")
In the beginning...
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
---
common-lisp
> (show-common-lisp-symbols)
functions
▀▀▀▀▀▀▀▀▀
* +
- /
/= 1+
1- <
<= =
> >=
ABORT ABS
ACONS ACOS
ACOSH ADD-METHOD
ADJOIN ADJUST-ARRAY
ADJUSTABLE-ARRAY-P ALLOCATE-INSTANCE
ALPHA-CHAR-P ALPHANUMERICP
AND APPEND
APPLY APROPOS
APROPOS-LIST AREF
ARITHMETIC-ERROR-OPERANDS ARITHMETIC-ERROR-OPERATION
ARRAY-DIMENSION ARRAY-DIMENSIONS
ARRAY-DISPLACEMENT ARRAY-ELEMENT-TYPE
ARRAY-HAS-FILL-POINTER-P ARRAY-IN-BOUNDS-P
ARRAY-RANK ARRAY-ROW-MAJOR-INDEX
ARRAY-TOTAL-SIZE ARRAYP
ASH ASIN
ASINH ASSERT
ASSOC ASSOC-IF
ASSOC-IF-NOT ATAN
ATANH ATOM
BIT BIT-AND
BIT-ANDC1 BIT-ANDC2
BIT-EQV BIT-IOR
BIT-NAND BIT-NOR
BIT-NOT BIT-ORC1
BIT-ORC2 BIT-VECTOR-P
BIT-XOR BLOCK
BOOLE BOTH-CASE-P
BOUNDP BREAK
BROADCAST-STREAM-STREAMS BUTLAST
BYTE BYTE-POSITION
BYTE-SIZE CAAAAR
CAAADR CAAAR
CAADAR CAADDR
CAADR CAAR
CADAAR CADADR
CADAR CADDAR
CADDDR CADDR
CADR CALL-METHOD
CAR CASE
CATCH CCASE
CDAAAR CDAADR
CDAAR CDADAR
CDADDR CDADR
CDAR CDDAAR
CDDADR CDDAR
CDDDAR CDDDDR
CDDDR CDDR
CDR CEILING
CELL-ERROR-NAME CERROR
CHANGE-CLASS CHAR
CHAR-CODE CHAR-DOWNCASE
CHAR-EQUAL CHAR-GREATERP
CHAR-INT CHAR-LESSP
CHAR-NAME CHAR-NOT-EQUAL
CHAR-NOT-GREATERP CHAR-NOT-LESSP
CHAR-UPCASE CHAR/=
CHAR< CHAR<=
CHAR= CHAR>
CHAR>= CHARACTER
CHARACTERP CHECK-TYPE
CIS CLASS-NAME
CLASS-OF CLEAR-INPUT
CLEAR-OUTPUT CLOSE
CLRHASH CODE-CHAR
COERCE COMPILE
COMPILE-FILE COMPILE-FILE-PATHNAME
COMPILED-FUNCTION-P COMPILER-MACRO-FUNCTION
COMPLEMENT COMPLEX
COMPLEXP COMPUTE-APPLICABLE-METHODS
COMPUTE-RESTARTS CONCATENATE
CONCATENATED-STREAM-STREAMS COND
CONJUGATE CONS
CONSP CONSTANTLY
CONSTANTP CONTINUE
COPY-ALIST COPY-LIST
COPY-PPRINT-DISPATCH COPY-READTABLE
COPY-SEQ COPY-STRUCTURE
COPY-SYMBOL COPY-TREE
COS COSH
COUNT COUNT-IF
COUNT-IF-NOT CTYPECASE
DECF DECLAIM
DECODE-FLOAT DECODE-UNIVERSAL-TIME
DEFCLASS DEFCONSTANT
DEFGENERIC DEFINE-COMPILER-MACRO
DEFINE-CONDITION DEFINE-METHOD-COMBINATION
DEFINE-MODIFY-MACRO DEFINE-SETF-EXPANDER
DEFINE-SYMBOL-MACRO DEFMACRO
DEFMETHOD DEFPACKAGE
DEFPARAMETER DEFSETF
DEFSTRUCT DEFTYPE
DEFUN DEFVAR
DELETE DELETE-DUPLICATES
DELETE-FILE DELETE-IF
DELETE-IF-NOT DELETE-PACKAGE
DENOMINATOR DEPOSIT-FIELD
DESCRIBE DESCRIBE-OBJECT
DESTRUCTURING-BIND DIGIT-CHAR
DIGIT-CHAR-P DIRECTORY
DIRECTORY-NAMESTRING DISASSEMBLE
DO DO*
DO-ALL-SYMBOLS DO-EXTERNAL-SYMBOLS
DO-SYMBOLS DOCUMENTATION
DOLIST DOTIMES
DPB DRIBBLE
ECASE ECHO-STREAM-INPUT-STREAM
ECHO-STREAM-OUTPUT-STREAM ED
EIGHTH ELT
ENCODE-UNIVERSAL-TIME ENDP
ENOUGH-NAMESTRING ENSURE-DIRECTORIES-EXIST
ENSURE-GENERIC-FUNCTION EQ
EQL EQUAL
EQUALP ERROR
ETYPECASE EVAL
EVAL-WHEN EVENP
EVERY EXP
EXPORT EXPT
FBOUNDP FCEILING
FDEFINITION FFLOOR
FIFTH FILE-AUTHOR
FILE-ERROR-PATHNAME FILE-LENGTH
FILE-NAMESTRING FILE-POSITION
FILE-STRING-LENGTH FILE-WRITE-DATE
FILL FILL-POINTER
FIND FIND-ALL-SYMBOLS
FIND-CLASS FIND-IF
FIND-IF-NOT FIND-METHOD
FIND-PACKAGE FIND-RESTART
FIND-SYMBOL FINISH-OUTPUT
FIRST FLET
FLOAT FLOAT-DIGITS
FLOAT-PRECISION FLOAT-RADIX
FLOAT-SIGN FLOATP
FLOOR FMAKUNBOUND
FORCE-OUTPUT FORMAT
FORMATTER FOURTH
FRESH-LINE FROUND
FTRUNCATE FUNCALL
FUNCTION FUNCTION-KEYWORDS
FUNCTION-LAMBDA-EXPRESSION FUNCTIONP
GCD GENSYM
GENTEMP GET
GET-DECODED-TIME GET-DISPATCH-MACRO-CHARACTER
GET-INTERNAL-REAL-TIME GET-INTERNAL-RUN-TIME
GET-MACRO-CHARACTER GET-OUTPUT-STREAM-STRING
GET-PROPERTIES GET-SETF-EXPANSION
GET-UNIVERSAL-TIME GETF
GETHASH GO
GRAPHIC-CHAR-P HANDLER-BIND
HANDLER-CASE HASH-TABLE-COUNT
HASH-TABLE-P HASH-TABLE-REHASH-SIZE
HASH-TABLE-REHASH-THRESHOLD HASH-TABLE-SIZE
HASH-TABLE-TEST HOST-NAMESTRING
IDENTITY IF
IGNORE-ERRORS IMAGPART
IMPORT IN-PACKAGE
INCF INITIALIZE-INSTANCE
INPUT-STREAM-P INSPECT
INTEGER-DECODE-FLOAT INTEGER-LENGTH
INTEGERP INTERACTIVE-STREAM-P
INTERN INTERSECTION
INVALID-METHOD-ERROR INVOKE-DEBUGGER
INVOKE-RESTART INVOKE-RESTART-INTERACTIVELY
ISQRT KEYWORDP
LABELS LAMBDA
LAST LCM
LDB LDB-TEST
LDIFF LENGTH
LET LET*
LISP-IMPLEMENTATION-TYPE LISP-IMPLEMENTATION-VERSION
LIST LIST*
LIST-ALL-PACKAGES LIST-LENGTH
LISTEN LISTP
LOAD LOAD-LOGICAL-PATHNAME-TRANSLATIONS
LOAD-TIME-VALUE LOCALLY
LOG LOGAND
LOGANDC1 LOGANDC2
LOGBITP LOGCOUNT
LOGEQV LOGICAL-PATHNAME
LOGICAL-PATHNAME-TRANSLATIONS LOGIOR
LOGNAND LOGNOR
LOGNOT LOGORC1
LOGORC2 LOGTEST
LOGXOR LONG-SITE-NAME
LOOP LOOP-FINISH
LOWER-CASE-P MACHINE-INSTANCE
MACHINE-TYPE MACHINE-VERSION
MACRO-FUNCTION MACROEXPAND
MACROEXPAND-1 MACROLET
MAKE-ARRAY MAKE-BROADCAST-STREAM
MAKE-CONCATENATED-STREAM MAKE-CONDITION
MAKE-DISPATCH-MACRO-CHARACTER MAKE-ECHO-STREAM
MAKE-HASH-TABLE MAKE-INSTANCE
MAKE-INSTANCES-OBSOLETE MAKE-LIST
MAKE-LOAD-FORM MAKE-LOAD-FORM-SAVING-SLOTS
MAKE-PACKAGE MAKE-PATHNAME
MAKE-RANDOM-STATE MAKE-SEQUENCE
MAKE-STRING MAKE-STRING-INPUT-STREAM
MAKE-STRING-OUTPUT-STREAM MAKE-SYMBOL
MAKE-SYNONYM-STREAM MAKE-TWO-WAY-STREAM
MAKUNBOUND MAP
MAP-INTO MAPC
MAPCAN MAPCAR
MAPCON MAPHASH
MAPL MAPLIST
MASK-FIELD MAX
MEMBER MEMBER-IF
MEMBER-IF-NOT MERGE
MERGE-PATHNAMES METHOD-COMBINATION-ERROR
METHOD-QUALIFIERS MIN
MINUSP MISMATCH
MOD MUFFLE-WARNING
MULTIPLE-VALUE-BIND MULTIPLE-VALUE-CALL
MULTIPLE-VALUE-LIST MULTIPLE-VALUE-PROG1
MULTIPLE-VALUE-SETQ NAME-CHAR
NAMESTRING NBUTLAST
NCONC NINTERSECTION
NINTH NO-APPLICABLE-METHOD
NO-NEXT-METHOD NOT
NOTANY NOTEVERY
NRECONC NREVERSE
NSET-DIFFERENCE NSET-EXCLUSIVE-OR
NSTRING-CAPITALIZE NSTRING-DOWNCASE
NSTRING-UPCASE NSUBLIS
NSUBST NSUBST-IF
NSUBST-IF-NOT NSUBSTITUTE
NSUBSTITUTE-IF NSUBSTITUTE-IF-NOT
NTH NTH-VALUE
NTHCDR NULL
NUMBERP NUMERATOR
NUNION ODDP
OPEN OPEN-STREAM-P
OR OUTPUT-STREAM-P
PACKAGE-ERROR-PACKAGE PACKAGE-NAME
PACKAGE-NICKNAMES PACKAGE-SHADOWING-SYMBOLS
PACKAGE-USE-LIST PACKAGE-USED-BY-LIST
PACKAGEP PAIRLIS
PARSE-INTEGER PARSE-NAMESTRING
PATHNAME PATHNAME-DEVICE
PATHNAME-DIRECTORY PATHNAME-HOST
PATHNAME-MATCH-P PATHNAME-NAME
PATHNAME-TYPE PATHNAME-VERSION
PATHNAMEP PEEK-CHAR
PHASE PLUSP
POP POSITION
POSITION-IF POSITION-IF-NOT
PPRINT PPRINT-DISPATCH
PPRINT-EXIT-IF-LIST-EXHAUSTED PPRINT-FILL
PPRINT-INDENT PPRINT-LINEAR
PPRINT-LOGICAL-BLOCK PPRINT-NEWLINE
PPRINT-POP PPRINT-TAB
PPRINT-TABULAR PRIN1
PRIN1-TO-STRING PRINC
PRINC-TO-STRING PRINT
PRINT-NOT-READABLE-OBJECT PRINT-OBJECT
PRINT-UNREADABLE-OBJECT PROBE-FILE
PROCLAIM PROG
PROG* PROG1
PROG2 PROGN
PROGV PROVIDE
PSETF PSETQ
PUSH PUSHNEW
QUOTE RANDOM
RANDOM-STATE-P RASSOC
RASSOC-IF RASSOC-IF-NOT
RATIONAL RATIONALIZE
RATIONALP READ
READ-BYTE READ-CHAR
READ-CHAR-NO-HANG READ-DELIMITED-LIST
READ-FROM-STRING READ-LINE
READ-PRESERVING-WHITESPACE READ-SEQUENCE
READTABLE-CASE READTABLEP
REALP REALPART
REDUCE REINITIALIZE-INSTANCE
REM REMF
REMHASH REMOVE
REMOVE-DUPLICATES REMOVE-IF
REMOVE-IF-NOT REMOVE-METHOD
REMPROP RENAME-FILE
RENAME-PACKAGE REPLACE
REQUIRE REST
RESTART-BIND RESTART-CASE
RESTART-NAME RETURN
RETURN-FROM REVAPPEND
REVERSE ROOM
ROTATEF ROUND
ROW-MAJOR-AREF RPLACA
RPLACD SBIT
SCALE-FLOAT SCHAR
SEARCH SECOND
SET SET-DIFFERENCE
SET-DISPATCH-MACRO-CHARACTER SET-EXCLUSIVE-OR
SET-MACRO-CHARACTER SET-PPRINT-DISPATCH
SET-SYNTAX-FROM-CHAR SETF
SETQ SEVENTH
SHADOW SHADOWING-IMPORT
SHARED-INITIALIZE SHIFTF
SHORT-SITE-NAME SIGNAL
SIGNUM SIMPLE-BIT-VECTOR-P
SIMPLE-CONDITION-FORMAT-ARGUMENTS SIMPLE-CONDITION-FORMAT-CONTROL
SIMPLE-STRING-P SIMPLE-VECTOR-P
SIN SINH
SIXTH SLEEP
SLOT-BOUNDP SLOT-EXISTS-P
SLOT-MAKUNBOUND SLOT-MISSING
SLOT-UNBOUND SLOT-VALUE
SOFTWARE-TYPE SOFTWARE-VERSION
SOME SORT
SPECIAL-OPERATOR-P SQRT
STABLE-SORT STANDARD-CHAR-P
STEP STORE-VALUE
STREAM-ELEMENT-TYPE STREAM-ERROR-STREAM
STREAM-EXTERNAL-FORMAT STREAMP
STRING STRING-CAPITALIZE
STRING-DOWNCASE STRING-EQUAL
STRING-GREATERP STRING-LEFT-TRIM
STRING-LESSP STRING-NOT-EQUAL
STRING-NOT-GREATERP STRING-NOT-LESSP
STRING-RIGHT-TRIM STRING-TRIM
STRING-UPCASE STRING/=
STRING< STRING<=
STRING= STRING>
STRING>= STRINGP
SUBLIS SUBSEQ
SUBSETP SUBST
SUBST-IF SUBST-IF-NOT
SUBSTITUTE SUBSTITUTE-IF
SUBSTITUTE-IF-NOT SUBTYPEP
SVREF SXHASH
SYMBOL-FUNCTION SYMBOL-MACROLET
SYMBOL-NAME SYMBOL-PACKAGE
SYMBOL-PLIST SYMBOL-VALUE
SYMBOLP SYNONYM-STREAM-SYMBOL
TAGBODY TAILP
TAN TANH
TENTH TERPRI
THE THIRD
THROW TIME
TRACE TRANSLATE-LOGICAL-PATHNAME
TRANSLATE-PATHNAME TREE-EQUAL
TRUENAME TRUNCATE
TWO-WAY-STREAM-INPUT-STREAM TWO-WAY-STREAM-OUTPUT-STREAM
TYPE-ERROR-DATUM TYPE-ERROR-EXPECTED-TYPE
TYPE-OF TYPECASE
TYPEP UNBOUND-SLOT-INSTANCE
UNEXPORT UNINTERN
UNION UNLESS
UNREAD-CHAR UNTRACE
UNUSE-PACKAGE UNWIND-PROTECT
UPDATE-INSTANCE-FOR-DIFFERENT-CLASS UPDATE-INSTANCE-FOR-REDEFINED-CLASS
UPGRADED-ARRAY-ELEMENT-TYPE UPGRADED-COMPLEX-PART-TYPE
UPPER-CASE-P USE-PACKAGE
USE-VALUE USER-HOMEDIR-PATHNAME
VALUES VALUES-LIST
VECTOR VECTOR-POP
VECTOR-PUSH VECTOR-PUSH-EXTEND
VECTORP WARN
WHEN WILD-PATHNAME-P
WITH-ACCESSORS WITH-COMPILATION-UNIT
WITH-CONDITION-RESTARTS WITH-HASH-TABLE-ITERATOR
WITH-INPUT-FROM-STRING WITH-OPEN-FILE
WITH-OPEN-STREAM WITH-OUTPUT-TO-STRING
WITH-PACKAGE-ITERATOR WITH-SIMPLE-RESTART
WITH-SLOTS WITH-STANDARD-IO-SYNTAX
WRITE WRITE-BYTE
WRITE-CHAR WRITE-LINE
WRITE-SEQUENCE WRITE-STRING
WRITE-TO-STRING Y-OR-N-P
YES-OR-NO-P ZEROP
everything else
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
&ALLOW-OTHER-KEYS &AUX
&BODY &ENVIRONMENT
&KEY &OPTIONAL
&REST &WHOLE
** ***
*BREAK-ON-SIGNALS* *COMPILE-FILE-PATHNAME*
*COMPILE-FILE-TRUENAME* *COMPILE-PRINT*
*COMPILE-VERBOSE* *DEBUG-IO*
*DEBUGGER-HOOK* *DEFAULT-PATHNAME-DEFAULTS*
*ERROR-OUTPUT* *FEATURES*
*GENSYM-COUNTER* *LOAD-PATHNAME*
*LOAD-PRINT* *LOAD-TRUENAME*
*LOAD-VERBOSE* *MACROEXPAND-HOOK*
*MODULES* *PACKAGE*
*PRINT-ARRAY* *PRINT-BASE*
*PRINT-CASE* *PRINT-CIRCLE*
*PRINT-ESCAPE* *PRINT-GENSYM*
*PRINT-LENGTH* *PRINT-LEVEL*
*PRINT-LINES* *PRINT-MISER-WIDTH*
*PRINT-PPRINT-DISPATCH* *PRINT-PRETTY*
*PRINT-RADIX* *PRINT-READABLY*
*PRINT-RIGHT-MARGIN* *QUERY-IO*
*RANDOM-STATE* *READ-BASE*
*READ-DEFAULT-FLOAT-FORMAT* *READ-EVAL*
*READ-SUPPRESS* *READTABLE*
*STANDARD-INPUT* *STANDARD-OUTPUT*
*TERMINAL-IO* *TRACE-OUTPUT*
++ +++
// ///
ARITHMETIC-ERROR ARRAY
ARRAY-DIMENSION-LIMIT ARRAY-RANK-LIMIT
ARRAY-TOTAL-SIZE-LIMIT BASE-CHAR
BASE-STRING BIGNUM
BIT-VECTOR BOOLE-1
BOOLE-2 BOOLE-AND
BOOLE-ANDC1 BOOLE-ANDC2
BOOLE-C1 BOOLE-C2
BOOLE-CLR BOOLE-EQV
BOOLE-IOR BOOLE-NAND
BOOLE-NOR BOOLE-ORC1
BOOLE-ORC2 BOOLE-SET
BOOLE-XOR BOOLEAN
BROADCAST-STREAM BUILT-IN-CLASS
CALL-ARGUMENTS-LIMIT CALL-NEXT-METHOD
CELL-ERROR CHAR-CODE-LIMIT
CLASS COMPILATION-SPEED
COMPILED-FUNCTION COMPILER-MACRO
CONCATENATED-STREAM CONDITION
CONTROL-ERROR DEBUG
DECLARATION DECLARE
DIVISION-BY-ZERO DOUBLE-FLOAT
DOUBLE-FLOAT-EPSILON DOUBLE-FLOAT-NEGATIVE-EPSILON
DYNAMIC-EXTENT ECHO-STREAM
END-OF-FILE EXTENDED-CHAR
FILE-ERROR FILE-STREAM
FIXNUM FLOATING-POINT-INEXACT
FLOATING-POINT-INVALID-OPERATION FLOATING-POINT-OVERFLOW
FLOATING-POINT-UNDERFLOW FTYPE
GENERIC-FUNCTION HASH-TABLE
IGNORABLE IGNORE
INLINE INTEGER
INTERNAL-TIME-UNITS-PER-SECOND KEYWORD
LAMBDA-LIST-KEYWORDS LAMBDA-PARAMETERS-LIMIT
LEAST-NEGATIVE-DOUBLE-FLOAT LEAST-NEGATIVE-LONG-FLOAT
LEAST-NEGATIVE-NORMALIZED-DOUBLE-FLOAT LEAST-NEGATIVE-NORMALIZED-LONG-FLOAT
LEAST-NEGATIVE-NORMALIZED-SHORT-FLOAT LEAST-NEGATIVE-NORMALIZED-SINGLE-FLOAT
LEAST-NEGATIVE-SHORT-FLOAT LEAST-NEGATIVE-SINGLE-FLOAT
LEAST-POSITIVE-DOUBLE-FLOAT LEAST-POSITIVE-LONG-FLOAT
LEAST-POSITIVE-NORMALIZED-DOUBLE-FLOAT LEAST-POSITIVE-NORMALIZED-LONG-FLOAT
LEAST-POSITIVE-NORMALIZED-SHORT-FLOAT LEAST-POSITIVE-NORMALIZED-SINGLE-FLOAT
LEAST-POSITIVE-SHORT-FLOAT LEAST-POSITIVE-SINGLE-FLOAT
LONG-FLOAT LONG-FLOAT-EPSILON
LONG-FLOAT-NEGATIVE-EPSILON MAKE-METHOD
METHOD METHOD-COMBINATION
MOST-NEGATIVE-DOUBLE-FLOAT MOST-NEGATIVE-FIXNUM
MOST-NEGATIVE-LONG-FLOAT MOST-NEGATIVE-SHORT-FLOAT
MOST-NEGATIVE-SINGLE-FLOAT MOST-POSITIVE-DOUBLE-FLOAT
MOST-POSITIVE-FIXNUM MOST-POSITIVE-LONG-FLOAT
MOST-POSITIVE-SHORT-FLOAT MOST-POSITIVE-SINGLE-FLOAT
MULTIPLE-VALUES-LIMIT NEXT-METHOD-P
NIL NOTINLINE
NUMBER OPTIMIZE
OTHERWISE PACKAGE
PACKAGE-ERROR PARSE-ERROR
PI PRINT-NOT-READABLE
PROGRAM-ERROR RANDOM-STATE
RATIO READER-ERROR
READTABLE REAL
RESTART SAFETY
SATISFIES SEQUENCE
SERIOUS-CONDITION SHORT-FLOAT
SHORT-FLOAT-EPSILON SHORT-FLOAT-NEGATIVE-EPSILON
SIGNED-BYTE SIMPLE-ARRAY
SIMPLE-BASE-STRING SIMPLE-BIT-VECTOR
SIMPLE-CONDITION SIMPLE-ERROR
SIMPLE-STRING SIMPLE-TYPE-ERROR
SIMPLE-VECTOR SIMPLE-WARNING
SINGLE-FLOAT SINGLE-FLOAT-EPSILON
SINGLE-FLOAT-NEGATIVE-EPSILON SPACE
SPECIAL SPEED
STANDARD STANDARD-CHAR
STANDARD-CLASS STANDARD-GENERIC-FUNCTION
STANDARD-METHOD STANDARD-OBJECT
STORAGE-CONDITION STREAM
STREAM-ERROR STRING-STREAM
STRUCTURE STRUCTURE-CLASS
STRUCTURE-OBJECT STYLE-WARNING
SYMBOL SYNONYM-STREAM
T TWO-WAY-STREAM
TYPE TYPE-ERROR
UNBOUND-SLOT UNBOUND-VARIABLE
UNDEFINED-FUNCTION UNSIGNED-BYTE
VARIABLE WARNING
---
naked-repl
USE-NAKED-REPL will turn a SLIME REPL into a REPL able to execute function calls
without the outer set of parenthesis.
This has the effect of turning the REPL into a command line.
> (use-naked-repl)
Now using a naked repl.
> + 1 2
3
> cons 3 4
(3 . 4)
> help
BULLSEYE Draw a bullseye.
DRAW-CELLULAR-AUTOMATA Draw an elementary cellular automata.
...
> use-naked-repl nil
No longer using a naked repl.
---
words
> (print-table (group (collect 50 (random-word)) 4))
funded transvestism Confucianisms mucus
landlord's nakeder Jr's deputies
uninitialized Anglophiles waistline Truckee
morned Erse's Negro's amplify
omniscient Arrhenius's syllogisms tenancy's
gourmand's conceive Woolworth carpus
exaggerate Harper's bankrupt questionnaire
molehills roué's accordance microfilming
look crossword vocation unpromising
sewed nip sough croupier's
recidivism's Anatole's credenza atones
heavenly Taegu's Lucas tiles
petty choral
> (print-table (group (coerce (let ((start (random (length *words*)))) (subseq *words* start (+ start 200))) 'list) 5))
misnomers misogynist misogynist's misogynistic misogynists
misogyny misogyny's misplace misplaced misplaces
misplacing misplay misplayed misplaying misplays
misprint misprint's misprinted misprinting misprints
mispronounce mispronounced mispronounces mispronouncing mispronunciation
mispronunciation's mispronunciations misquotation misquotation's misquotations
misquote misquoted misquotes misquoting misread
misreading misreadings misreads misrepresent misrepresentation
misrepresentation's misrepresentations misrepresented misrepresenting misrepresents
misrule misruled misrules misruling miss
missal missal's missals missed misses
misshapen missile missile's missilery missilery's
missiles missing mission mission's missionaries
missionary missionary's missioned missioning missions
missive missive's missives misspell misspelled
misspelling misspelling's misspellings misspells misspelt
misspend misspending misspends misspent misstate
misstated misstatement misstatement's misstatements misstates
misstating misstep misstep's misstepped misstepping
missteps mist mist's mistake mistake's
mistaken mistakenly mistakes mistaking misted
mister mister's misters mistier mistiest
mistily mistime mistimed mistimes mistiming
mistiness misting mistletoe mistletoe's mistook
mistranslated mistreat mistreated mistreating mistreatment
mistreatment's mistreats mistress mistress's mistresses
mistrial mistrial's mistrials mistrust mistrusted
mistrustful mistrusting mistrusts mists misty
mistype mistypes mistyping misunderstand misunderstanding
misunderstanding's misunderstandings misunderstands misunderstood misuse
misuse's misused misuses misusing mite
mite's miter miter's mitered mitering
miters mites mitigate mitigated mitigates
mitigating mitigation mitigation's mitosis mitosis's
mitt mitt's mitten mitten's mittens
mitts mix mixed mixer mixer's
mixers mixes mixing mixt mixture
mixture's mixtures mizzen mizzen's mizzenmast
mizzenmast's mizzenmasts mizzens mnemonic mnemonics
mnemonics's moan moan's moaned moaning
---
bugout
BUGOUT is used to insert printouts at various points in developing code.
BUGOUTs are never left in code, but rather, inserted at select points
while iteratively developing to see the state of variables at those
points.
> (let ((a 1) (b 2)) (bugout a b :foo (+ a b)))
>>> A 1 B 2 :FOO (+ A B) 3
The above BUGOUT macro expanded into
(FORMAT T "~%>>> A ~S B ~S :FOO (+ A B) ~S~2%" A B (+ A B))
---
breakout
BREAKOUT is like BUGOUT, but signals a BREAK with the select variables
being the arguments to this BREAK. This allows for easily inserting
breakpoints that give readouts of variables and also further access
from within the SLIME debugger backtrace to these variables.
---
flatten
Pay Attention!! A classic utility is being introduced here!
FLATTEN takes trees of CONSes and returns all the non-NIL leaves.
> (flatten '(1 nil 2))
(1 2)
> (flatten '(1 (2 (3))))
(1 2 3)
> (flatten '(1 (2 (3) (4 (5 6)))))
(1 2 3 4 5 6)
Yes, fellow acadamians, Lisp supports trees out of the box!
---
read-lisp-file
> (read-lisp-file "/emerald-city/academy/war.lisp")
((IN-PACKAGE :ACADEMY)
(DEFUN WAR ()
"Global Thermonuclear War"
(FORMAT T "A strange game. The only winning move is not to play.~%")))
This commit demonstrates the method of using a GENSYM for the
EOF-VALUE for READ.
---
show-all-used-common-lisp-symbols
For listing all the symbols in a particular package that come from the CL package.
> (show-all-used-common-lisp-symbols :academy)
functions
▀▀▀▀▀▀▀▀▀
* + - /
/= 1+ 1- <
<= = > >=
ABS ADJUST-ARRAY AND APPLY
AREF ARRAY-DIMENSIONS ASSOC ASSOC-IF
ATAN BOUNDP BREAK CAR
CASE CDDDR CDR CHAR
CHAR-CODE CHAR-NAME CHAR-UPCASE CHAR=
CHARACTER CODE-CHAR COERCE CONCATENATE
COND CONS CONSP COS
COUNT DECF DEFMACRO DEFPACKAGE
DEFPARAMETER DEFSTRUCT DEFUN DEFVAR
DESTRUCTURING-BIND DIGIT-CHAR-P DIRECTORY-NAMESTRING DO
DOCUMENTATION DOTIMES ECASE ELT
EQ EQL EQUAL EQUALP
ERROR EVENP EVERY FBOUNDP
FILE-LENGTH FILE-POSITION FIND FIND-SYMBOL
FIRST FLET FLOOR FORCE-OUTPUT
FORMAT FRESH-LINE FUNCALL FUNCTION
GENSYM GET-UNIVERSAL-TIME GETHASH HANDLER-CASE
IDENTITY IF IN-PACKAGE INCF
INTERSECTION KEYWORDP LABELS LAMBDA
LENGTH LET LET* LIST
LISTP LOGAND LOGBITP LOGCOUNT
LOOP MACROLET MAKE-ARRAY MAKE-HASH-TABLE
MAKE-LIST MAKE-STRING MAP MAPCAR
MAX MEMBER MINUSP MOD
MULTIPLE-VALUE-BIND NOT NREVERSE NTH
NTHCDR NULL OR PARSE-INTEGER
PLUSP POSITION PRIN1 PRINC
PRINC-TO-STRING PROBE-FILE PROG1 PROGN
PUSH QUOTE RANDOM READ
READ-FROM-STRING READ-LINE READ-SEQUENCE REDUCE
REMOVE-DUPLICATES REMOVE-IF REMOVE-IF-NOT REST
RETURN REVERSE ROUND SECOND
SET SETF SIN SORT
STEP STRING STRING-DOWNCASE STRING<
SUBSEQ SYMBOL-FUNCTION SYMBOL-NAME SYMBOLP
TAN TERPRI THIRD TYPEP
UNLESS VALUES VECTOR WARN
WHEN WITH-INPUT-FROM-STRING WITH-OPEN-FILE WITH-OUTPUT-TO-STRING
WITH-SLOTS WRITE-CHAR WRITE-STRING ZEROP
everything else
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
&BODY &KEY &OPTIONAL &REST
*READ-EVAL* *STANDARD-OUTPUT* NUMBER PARSE-ERROR
PI SEQUENCE STREAM SYMBOL
T UNDEFINED-FUNCTION
---
add :INPUT argument to RUN-PROGRAM-TO-STRING
> (with-input-from-string (stream "foo") (run-program-to-string "cat" nil :input stream))
"foo"
---
spelling
> (spellcheck "Is that a snarfle is see yonder?")
("snarfle")
> (spellcheck-docstrings :academy)
SPELLCHECK-DOCSTRINGS : spelllling
...
---
faq.txt
How can I join the academy?
Membership is earned.
---
compliments
> (compliment)
You are so eloquent.
---
pedantic-if
IFs with no else clause or a NIL else clause should always be replaced
with a WHEN.
Adhering to style has concrete advantages. The advantage is that it
decreases the mental effort required for a human to parse and
understand the code. In this case, if adhered to, every IF you see
will always have an else clause. You can count on it. Ignore this
style and every time you see an IF you wont know until you read
further in the code. A definite advantage and valuable.
Here we shadow the standard IF with our own that warns when we violate
these style rules.
> (defun foo (a) (if (eq a :foo) :baz))
; in: DEFUN FOO
; (ACADEMY::IF (EQ ACADEMY::A :FOO) :BAZ)
;
; caught WARNING:
; A single legged IF should be replaced with a WHEN.
;
; compilation unit finished
; caught 1 WARNING condition
FOO
> (foo :foo)
:BAZ
> (foo 123)
NIL
> (if :foo :baz nil)
WARNING: An if's else of NIL should be replaced with a WHEN.
This commit demonstrates
* Shadowing core CL functionality with our own cooked up versions.
* Using the optional SUPPLIED-P-PARAMETER to distinguish between a
supplied NIL and no argument.
---
factorial
> (print-table (loop for x from 1 to 64 collect (list x (factorial x))))
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 39916800
12 479001600
13 6227020800
14 87178291200
15 1307674368000
16 20922789888000
17 355687428096000
18 6402373705728000
19 121645100408832000
20 2432902008176640000
21 51090942171709440000
22 1124000727777607680000
23 25852016738884976640000
24 620448401733239439360000
25 15511210043330985984000000
26 403291461126605635584000000
27 10888869450418352160768000000
28 304888344611713860501504000000
29 8841761993739701954543616000000
30 265252859812191058636308480000000
31 8222838654177922817725562880000000
32 263130836933693530167218012160000000
33 8683317618811886495518194401280000000
34 295232799039604140847618609643520000000
35 10333147966386144929666651337523200000000
36 371993326789901217467999448150835200000000
37 13763753091226345046315979581580902400000000
38 523022617466601111760007224100074291200000000
39 20397882081197443358640281739902897356800000000
40 815915283247897734345611269596115894272000000000
41 33452526613163807108170062053440751665152000000000
42 1405006117752879898543142606244511569936384000000000
43 60415263063373835637355132068513997507264512000000000
44 2658271574788448768043625811014615890319638528000000000
45 119622220865480194561963161495657715064383733760000000000
46 5502622159812088949850305428800254892961651752960000000000
47 258623241511168180642964355153611979969197632389120000000000
48 12413915592536072670862289047373375038521486354677760000000000
49 608281864034267560872252163321295376887552831379210240000000000
50 30414093201713378043612608166064768844377641568960512000000000000
51 1551118753287382280224243016469303211063259720016986112000000000000
52 80658175170943878571660636856403766975289505440883277824000000000000
53 4274883284060025564298013753389399649690343788366813724672000000000000
54 230843697339241380472092742683027581083278564571807941132288000000000000
55 12696403353658275925965100847566516959580321051449436762275840000000000000
56 710998587804863451854045647463724949736497978881168458687447040000000000000
57 40526919504877216755680601905432322134980384796226602145184481280000000000000
58 2350561331282878571829474910515074683828862318181142924420699914240000000000000
59 138683118545689835737939019720389406345902876772687432540821294940160000000000000
60 8320987112741390144276341183223364380754172606361245952449277696409600000000000000
61 507580213877224798800856812176625227226004528988036003099405939480985600000000000000
62 31469973260387937525653122354950764088012280797258232192163168247821107200000000000000
63 1982608315404440064116146708361898137544773690227268628106279599612729753600000000000000
64 126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000
---
safety
Common lisp's READ function parses a stream of characters and returns
lisp objects.
Now, by object, I'm not talking Object Orientated Programming (OOP),
but rather one of the many different types of things that lisp can
work with such as strings, numbers, and lists (well, really 'cons'
cells but that is to be described elsewhere).
With no arguments, READ reads from the keyboard:
> (read)
2.718 <- you type this in
2.718 <- what READ returns after converting to a lisp object
So READ parsed the stream of characters '2' '.' '7' '1' '8' and
returned the floating point number 2.718.
> (read)
foo
FOO
READ parsed the characters 'f' 'o' 'o' and returned the symbol FOO.
> (read)
"foo"
"foo"
> (read)
(we love lisp)
(WE LOVE LISP)
You get the idea.
Now, how the READ function does this is with the use of a thing called
a 'readtable' which contains all the rules for how to deal with
characters it is trying to parse.
In the standard readtable, the character sequence '#' followed by '.'
causes the reader to EVALuate the results of calling READ on the rest
of the sequence of characters.
Clear? Hmm....
> (read)
(+ 1 2)
(+ 1 2)
The reader parses '(' '+' ' ' '1' ' ' '2' ')' into the list (+ 1 2).
> (read)
#.(+ 1 2)
3
Note that the extra space above before the '#' is so that git doesn't
think the line is a comment and remove it.
The reader read '#' followed by '.' and then recursively called itself
to READ the sequence of characters '(' '+' ' ' '1' ' ' '2' ')' into
the list (+ 1 2) and then called EVAL on this list to get the result,
3.
> (read )
(+ #.(+ 1 2) 4)
(+ 3 4)
> (read)
#.(+ #.(+ 1 2) 4)
7
Now, this is all fine and dandy and useful *except* when this behavior
is not desirable. One very common case is when reading things from a
user or some other source where you do not have complete control as
this functionality allows for running *anything* in the system via
this input stream of characters.
BAD BAD things can happen if you do not account for this.
> (defun my-moon-weight? ()
(format t "What is your weight in pounds?~%")
(let ((weight (read)))
(format t "On the moon you would weigh ~F pounds.~%" (/ weight 6))))
MY-MOON-WEIGHT?
> (my-moon-weight?)
What is your weight in pounds?
165
On the moon you would weight 27.5 pounds.
This function does not check the validity of the input but that seems
OK because at least it will error out pretty quickly on bad input.
> (my-moon-weight?)
What is your weight in pounds?
one cheeseburger
ERROR: Argument X is not a NUMBER: ONE
All seems OK, but now see...
> (defun boo () (princ "Mwaaahhaahaa!!")
BOO
> (my-moon-weight?)
What is your weight in pounds?
#.(boo)
Mwaaahhaahaa!!
So the user has been able to run arbitrary code from this simple
little function, which might have been happily linked to a web page or
something open to the world. Oops.
The standard readtable has a variable *READ-EVAL* which controls
whether or not the sequence '#' '.' works or errors. Note that the
default is T.
This commit introduces SAFE-READ, which is a shortcut for binding
*READ-EVAL* to NIL.
> (safe-read)
#.(boo)
ERROR: can't read #. while *READ-EVAL* is NIL
The academy will always use SAFE-READ when reading from the keyboard
or anywhere that we do not have complete control of both the
horizontal and the vertical.
---
phonetic-alphabet
> (string-to-phonetic-alphabet "academy")
(ALFA CHARLIE ALFA DELTA ECHO MIKE YANKEE)
---
apple-ii-disks
> (show-apple-disk-catalog)
Catalog of DOS disk "/emerald-city/academy/vintage/prisoner.dsk".
HELLO APPLESOFT-BASIC
CAT INTEGER-BASIC
EDU-WARE APPLESOFT-BASIC
TONES BINARY
PR.BEGIN APPLESOFT-BASIC
PR.SQ1 APPLESOFT-BASIC
PR.VILLAGE APPLESOFT-BASIC
PR.SCHOOL APPLESOFT-BASIC
...
> (show-apple-disk-file "PR.CHURCH")
PR.CHURCH APPLESOFT-BASIC
1 ZZ=FRE(0) : POKE -16368,0
2 ONERR GOTO 32000
9 GOTO 1000
300 TEXT : INVERSE : L3%=3 : L4%=23 : H3%=4 : H4%=7 : GOSUB 395 : RETURN
310 NORMAL : POKE 32,16 : POKE 33,21 : POKE 34,15 : POKE 35,18 : HOME : RETURN
350 FOR I3=1 TO 2500 : NEXT I3 : RETURN
395 T1%=L4%-L3%+1 : VTAB H3% : FOR I3=H3% TO H4% : HTAB L3% : PRINT SPC(T1%) : PRINT : NEXT I3 : RETURN
400 GOSUB 500 : GOSUB 310 : INPUT IP$ : IP$=IP$+" " : A$=LEFT$ (IP$,1) : RETURN
500 GOSUB 300 : INVERSE : VTAB 4
501 A%=21 : IF LEN(TP$)<22 THEN HTAB 3 : PRINT TP$ : RETURN
503 IF MID$(TP$,A%,1)<>" " THEN A%=A%-1 : GOTO 503
505 HTAB 3 : PRINT LEFT$ (TP$,A%-1) : TP$=MID$(TP$,A%+1,LEN(TP$)-A%) : GOTO 501
650 GOSUB 400 : IF A$="N" THEN T2%=T2%+1
651 RETURN
655 GOSUB 400 : IF A$<>"N" THEN T2%=T2%+1
656 RETURN
1000 GOSUB 10000
1003 TP$="WILL YOU MAKE A 5 CREDIT CONTRIBUTION TO OUR CHURCH?" : GOSUB 500 : GOSUB 310 : INPUT IP$ : IF LEFT$ (IP$,1)<>"Y" THEN ID%=ID%+5 : GOTO 1008
1005 IF CR%>4 THEN CR%=CR%-5
1008 IF MR% THEN TP$="I UNDERSTAND YOU'VE GOTTEN YOURSELF INTO SOME TROUBLE, MY SON" : GOSUB 500 : GOSUB 350 : TP$="PLEASE FEEL FREE TO TALK ABOUT IT IF YOU WILL" : GOSUB 500 : GOTO 1013
1010 TP$="GREETINGS, MY CHILD. SHALL WE HAVE A CHAT?" : GOSUB 500
1011 GOSUB 310 : INPUT IP$ : IF LEFT$ (IP$,1)="N" THEN TP$="AS YOU WISH. IF YOU NEED SOMEONE TO TALK TO, I AM HERE" : GOSUB 500 : GOSUB 350 : GOTO 1020
1012 TP$="DON'T WORRY. ALL IS KEPT IN CONFIDENCE IN THESE CHAMBERS" : GOSUB 500 : CT%=ID%
1013 GOSUB 2000
1015 IF NOT(PS%(4)) AND ID%-CT%>10+INT(RND(1)* 20) THEN PS%(4)=PS%(4)+1 : TP$="TO COMFORT YOU IN THESE TIMES I AM GIVING YOU THIS CROSS" : GOSUB 500 : GOSUB 350
1020 TP$="REMAIN STRONG, MY CHILD" : GOSUB 500
1030 TEXT : NORMAL : PRINT : PRINT CH$
1035 CALL 520"PR.VILLAGE"
1999 END
2000 TP$="" : T1%=0 : GOSUB 310 : INPUT IP$ : IP$=IP$+" " : FOR I=1 TO LEN(IP$)-2 : A$=MID$(IP$,I,3) : IF A$="WHO" OR A$="WHA" OR A$="WHE" OR A$="HOW" OR A$="WHY" OR A$="? " THEN T1%=1 : GOTO 2010
2003 IF A$="ESC" OR A$="OFF" OR A$="LEA" OR A$="RUN" OR A$="PRI" OR A$="OUT" THEN T1%=2 : GOTO 2010
2004 IF A$="FUC" OR A$="SHI" OR A$="ASS" OR A$="BAS" OR A$="BIT" OR A$="DAM" THEN T1%=3 : GOTO 2010
2005 IF MR% AND (A$="MUR" OR A$="KIL" OR A$="COU" OR A$="GIR") THEN T1%=4 : GOTO 2010
2006 IF A$="BYE" THEN T1%=5 : GOTO 2010
2007 IF A$=RC$ THEN T1%=6 : GOTO 2010
2008 IF A$="ELP" THEN T1%=7 : GOTO 2010
2009 NEXT I : GOTO 2013
2010 I=I+2 : NEXT I
2013 T1%=T1%+1 : ON T1% GOTO 2100,2200,2300,2400,2500,2600,2700,2800
2020 GOSUB 500 : T1%=0 : GOTO 2000
2100 IF MR% AND INT(RND(1)* 2) THEN ON INT(RND(1)* 3)+1 GOSUB 15001,15002,15003 : GOTO 2020
2103 ON INT(RND(1)* 11)+1 GOSUB 11001,11002,11003,11004,11005,11006,11007,11008,11009,11010,11011 : GOTO 2020
2200 ON INT(RND(1)* 6)+1 GOSUB 12001,12002,12003,12004,12005,12006 : ID%=ID%+1 : GOTO 2020
2300 ID%=ID%+3 : IF ID%>400 AND INT(RND(1)* 1.1) THEN 3000
2303 ON INT(RND(1)* 4)+1 GOSUB 13001,13002,13003,13004,13005 : GOTO 2020
2400 TP$="FOUL LANGUAGE WILL NOT WIN YOU FRIENDS" : ID%=ID%-1 : GOTO 2020
2500 GOTO 3000
2600 RETURN
2700 POP : NORMAL : PRINT : PRINT CH$
2703 CALL 520"PR.LOSE"
2800 TP$="I AM HERE TO HELP YOU" : GOTO 2020
3000 TP$="YOU ARE INDEED IN TROUBLE. I MAY BE ABLE TO HELP YOU. ARE YOU INTERESTED?" : GOSUB 400 : IF A$="N" THEN TP$="AS YOU WISH. BUT PLEASE CONSIDER MY OFFER" : GOSUB 500 : GOTO 2000
3003 TP$="PLEASE CONSIDER CAREFULLY. HAVE YOU EVER ESCAPED FROM THE ISLAND?" : GOSUB 400 : IF A$="Y" THEN TP$="YOU KNOW YOU HAVEN'T" : GOSUB 500 : GOTO 3005
3004 TP$="I KNOW YOU HAVEN'T" : GOSUB 500
3005 GOSUB 350 : TP$="WHAT ARE YOU ESCAPING FROM, TRULY?" : GOSUB 400 : TP$="BUT THINK. HAVE YOU NOT ALWAYS BEEN A PRISONER?" : GOSUB 400 : IF A$="N" THEN TP$="OH? TRY TO REMEMBER THE LAST TIME YOU WHERE TRULY, TRULY FREE" : GOSUB 500 : GOSUB 350
3008 TP$="WHO ARE THE PRISONERS AND WHO ARE THE KEEPERS?" : GOSUB 400 : TP$="MEN ARE NOT PRISONERS OF FATE, BUT OF THEIR MINDS" : GOSUB 500 : GOSUB 350
3010 TP$="HAVE YOU NOT YET REALIZED THERE IS NO PHYSICAL ESCAPE?" : GOSUB 500 : GOSUB 350 : TP$="YOU HAVE ALWAYS BEEN HERE AND WILL ALWAYS BE HERE" : GOSUB 500 : GOSUB 350
3013 TP$="HOWEVER, THERE IS A FORM OF ESCAPE, IF YOU ARE WILLING" : GOSUB 500 : GOSUB 350 : TP$="IT IS AN ESCAPE FROM THE BONDAGE OF THIS ENSLAVING SOCIETY" : GOSUB 500 : GOSUB 350
3015 TP$="WOULD YOU CONSIDER JOINING THE PRIESTHOOD?" : GOSUB 400 : IF A$="N" THEN TP$="WON'T YOU RECONSIDER? ANY OTHER PATH MUST SEEM FRUITLESS" : GOSUB 400 : IF A$="N" THEN TP$="WELL, THE OFFER STANDS" : GOSUB 500 : GOTO 2000
3018 T2%=0 : TP$="LET US SEE IF YOU PASS THE TEST" : GOSUB 500 : GOSUB 350 : TP$="DO YOU USE TRADITIONAL APPROACHES TO PROBLEMS?" : GOSUB 650
3020 TP$="DO YOU BELIEVE LEARNING SHOULD BE PRACTICAL?" : GOSUB 650
3021 TP$="DO YOU PRIZE THE INDIVIDUAL ABOVE THE STATE?" : GOSUB 655
3023 TP$="DO YOU MEASURE SUCCESS BY ECONOMIC MEANS?" : GOSUB 650
3025 TP$="DO YOU FEEL THAT MANY ARTISTS ARE WEIRD OR IMMORAL?" : GOSUB 650
3026 TP$="DO YOU THINK SOME CORRUPTION IN GOVERNMENT IS INEVITABLE?" : GOSUB 655
3027 TP$="DO YOU THINK GOOD WORKS ARE MORE IMPORTANT THAN RELIGOUS BELIEFS?" : GOSUB 655
3028 TP$="DO YOU BELIEVE THAT PEOPLE SHOULD CONFORM TO SOCIAL EXPECTATIONS?" : GOSUB 650
3030 TP$="DO YOU JUDGE PEOPLE AND EVENTS MORALISTICALLY?" : GOSUB 650
3033 ID%=ID%+5* T2% : IF T2%<7 THEN TP$="I AM SORRY. YOU HAVE NOT YET LEARNED" : GOSUB 500 : GOSUB 350 : GOTO 2000
3035 TP$="GOOD. YOU PASS THE TESTS. NOW YOU MUST PROVE YOUR COMMITMENT" : GOSUB 500 : GOSUB 350 : TP$="YOU MUST DEMONSTRATE THAT YOU HAVE ESCAPED YOUR PREVIOUS LIFE" : GOSUB 500 : MR%=0
3040 GOSUB 310 : INPUT IP$ : IP$=IP$+" " : FOR I=1 TO LEN(IP$)-2 : A$=MID$(IP$,I,3) : IF A$=RC$ THEN T2%=0
3045 NEXT I : IF NOT(T2%) THEN GOTO 30000
3048 TP$="YOU HAVE NOT YET PROVED. ARE YOU STILL INTERESTED?" : GOSUB 400 : IF A$="N" THEN TP$="ARE YOU SURE?" : GOSUB 400 : IF A$="Y" THEN TP$="I AM SORRY. LIFE WILL BE HARD FOR YOU" : GOSUB 500 : GOSUB 350 : TP$="YOUR CRIMES ARE ABSOLVED" : GOSUB 500 : GOTO 2000
3050 TP$="OFFER PROOF THAT YOU HAVE GIVEN UP YOUR PAST" : GOSUB 500 : GOTO 3040
10000 TEXT : HOME : FLASH : FOR I=1 TO 24 : PRINT SPC(40) : NEXT I : GOSUB 300 : VTAB 1 : FOR I=1 TO 23 : HTAB 12 : PRINT " " : NEXT I : GOSUB 310 : TEXT : RETURN
11001 TP$="A SMOOTH SEA NEVER MADE A SKILLFUL SAILOR" : RETURN
11002 TP$="HE WHO WOULD LEAP MUST MAKE A LONG RUN" : RETURN
11003 TP$="NOTHING IS EASY TO THE UNWILLING" : RETURN
11004 TP$="A HARD BEGINNING MAKES A GOOD ENDING" : RETURN
11005 TP$="I UNDERSTAND" : RETURN
11006 TP$="PLEASE, CONTINUE" : RETURN
11007 TP$="GO ON. A FRIENDLY EAR CAN RELIEVE A TROUBLED MIND" : RETURN
11008 TP$="I HEAR YOU" : RETURN
11009 TP$="I SEE" : RETURN
11010 TP$="THE TRUTH SHALL SET YOU FREE" : RETURN
11011 TP$="DON'T BE AFRAID TO CONFIDE IN ME. NO MAN IS AN ISLAND" : RETURN
12001 TP$="LIFE HAS NO ANSWERS ; ONLY MORE QUESTIONS" : RETURN
12002 TP$="WHO WOULD KNOW BETTER?" : RETURN
12003 TP$="SEARCH YOURSELF FOR THE TRUTH" : RETURN
12004 TP$="WE ENTER THE WORLD KNOWING ALL WE NEED TO KNOW" : RETURN
12005 TP$="ANSWERS ARE A PRISON FOR ONESELF" : RETURN
12006 TP$="ANSWERS MAY BE FOUND IN THE GOOD BOOK" : RETURN
13001 TP$="THE ABSENT SHALL NOT BE MADE HEIR" : RETURN
13002 TP$="EVERY EXIT IS BUT AN ENTRY SOMEWHERE ELSE" : RETURN
13003 TP$="MAN IS BORN FREE BUT EVERYWHERE HE IS IN CHAINS" : RETURN
13004 TP$="HE THAT IS DISCONTENTED IN ONE PLACE IS SELDOM HAPPY IN ANOTHER" : RETURN
13005 TP$="ONLY HE WHO TAKES CARE OF YOU CAN SET YOU FREE" : RETURN
15001 TP$="CONFESS YOUR SINS" : RETURN
15002 TP$="GUILT SHOULD NOT BE KEPT BOTTLED UP" : RETURN
15003 TP$="ARE YOU SURE THERE ISN'T SOMETHING ELSE YOU WOULD LIKE TO TALK ABOUT?" : RETURN
30000 POP : NORMAL : PRINT : PRINT CH$
30003 CALL 520"PR.LOSE"
32000 T1%=PEEK(222) : CALL 1002 : IF T1%=5 OR T1%=6 OR T1%=7 OR T1%=13 THEN RESUME
32003 NORMAL : TEXT : PRINT : PRINT CH$
32005 IF T1%=255 THEN CALL 520"PR.SAVE"
32008 CALL 520"PR.ERR"
---