I'm currently swimming in Racket. Honestly I've rarely seen such a neat and powerful language.
EDIT:
Look ma!
(define make-counter
(lambda ()
(let ((n 0))
(lambda () (set! n (add1 n)) n))))
> (define c1 (make-counter))
> (define c2 (make-counter))
> (c1)
1
> (c1)
2
> (c1)
3
> (c2)
1
> (c2)
2
> (c1)
4
>
Come on guys, water is fresh and fishes are beautiful!!!
Using Nodejs REPL from inside Racket:
> (define-values (p out in err)
(subprocess #f #f #f "C:/Hangar/nodejs/node.exe"))
> (display "console.log('hello from node');" in)
> (close-output-port in)
> (read-line out)
"hello from node"
>
A little Datalog in my Racket:
#lang racket
(require datalog)
(define geo (make-theory))
(datalog geo
(! (edge a b))
(! (edge b c))
(! (edge a d))
(! (edge b d))
(! (edge d e))
(! (edge d f))
(! (edge f g))
(! (:- (path X Y) (edge X Y)))
(! (:- (path X Y) (edge X Z) (path Z Y))))
> (datalog geo (? (path X g)))
'(#hasheq((X . f)) #hasheq((X . a)) #hasheq((X . b)) #hasheq((X . d)))
Remember how stuff was defined...
#lang racket
(define user-function (make-hash))
(define (definition id)
(hash-ref user-function id))
(define-syntax-rule (define/keep id expr)
(begin
(hash-set! user-function 'id 'expr)
(define id expr)))
> (define/keep double (lambda (x) (* 2 x)))
> (double 5)
10
> (definition 'double)
'(lambda (x) (* 2 x))
> (eval (list (definition 'double) 10))
20
>