My permute version of queens is mega-fast compared to my previous mk version. 1.7 seconds for queens 8:
#lang racket/base
;; queens 1 = 1 : cpu time: 4 real time: 4 gc time: 0
;; queens 2 = 0 : cpu time: 1 real time: 1 gc time: 0
;; queens 3 = 0 : cpu time: 0 real time: 0 gc time: 0
;; queens 4 = 2 : cpu time: 0 real time: 0 gc time: 0
;; queens 5 = 10 : cpu time: 3 real time: 4 gc time: 0
;; queens 6 = 4 : cpu time: 18 real time: 18 gc time: 0
;; queens 7 = 40 : cpu time: 174 real time: 174 gc time: 4
;; queens 8 = 92 : cpu time: 1717 real time: 1716 gc time: 26
;; queens 9 = 352 : cpu time: 18773 real time: 18775 gc time: 232
;; queens 10 = 724 : cpu time: 229479 real time: 230187 gc time: 2865
(provide (all-defined-out))
(require "lib/reasonable.rkt")
(require "ch22.rkt")
(require (only-in racket/list range))
(define (safe b)
(define (no-diagonals° n m l)
(define (sub1° n m)
(cond-a [(null° n) (≈ n m)]
[(fresh (_)
(cons° m _ n))]))
(define (add1° n m)
(cons° n '() m))
(cond-a [(null° l) %s]
[else (fresh (a d n+1 n-1)
(sub1° n n-1)
(add1° m n+1)
(cons° a d l)
(cond-a [(≈ n+1 a) %u]
[(≈ n-1 a) %u]
[else (no-diagonals° n-1 n+1 d)]))]))
(cond-a [(null° b) %s]
[else (fresh (a d)
(cons° a d b)
(no-diagonals° a a d)
(safe d))]))
(define (permute l1 l2)
(define (do-insert x y out)
(cond-e [(cons° x y out)]
[(fresh (y1 y2 z)
(cons° y1 y2 y)
(cons° y1 z out)
(do-insert x y2 z))]))
(cond-e [(fresh (x)
(cons° x '() l1)
(cons° x '() l2))]
[(fresh (x y z1)
(cons° x y l1)
(cond-a [(≈ y '()) %u]
[else %s])
(permute y z1)
(do-insert x z1 l2))]))
;;; conversion utilities
(define (n->l n) ; number to list
(cond [(zero? n) '()]
[else (cons (n->l (sub1 n)) '())]))
(define (l->n l) ; list to number
(cond [(null? l) 0]
[else (add1 (l->n (car l)))]))
(define (ns->ls l) (map n->l l)) ; numbers to lists
(define (ls->ns l) (map l->n l)) ; lists to numbers
(define (lls->lns l) (map ls->ns l)) ; lists of lists to lists of numbers
(define (lns-lls l) (map ns->ls l)) ; lists of numbers to lists of lists
(define (queens n b)
(let ([rng (ns->ls (range 1 (add1 n)))])
(all
(permute rng b)
(safe b))))
(for ([n (range 1 13)])
(collect-garbage)
(time (printf "queens ~s = ~s : "
n
(length (run* (b) (queens n b))))))