我发现Racket真是一个很用心的语言. 它支持类似于Python的generator. 性能比Python还好, 除了语法上繁琐一些.
此外它还有各种各样的语法糖.感觉很方便.
#lang racket
(require racket/generator)
(define (safe? x y xys)
(if (null? xys)
#t
(let ((px (caar xys)) (py (cadar xys)))
(if (or (= y py) (= (- py y) (- px x)) (= (- py y) (- x px)))
#f
(safe? x y (cdr xys))))))
(define (nqueen n)
(let recur ((x (- n 1)))
(generator ()
(if (= x -1)
(yield '())
(for* ([xys (in-producer (recur (- x 1)) (void))]
[y (range n)])
(and (safe? x y xys)
(yield (cons (list x y) xys)))))
(void))))
(define gg (nqueen 18))
(displayln (gg))
; another version use in-generator
; (define (safe? x y xys)
; (for/and ([xy xys])
; (let ((px (car xy)) (py (cadr xy)))
; (not (or (= y py) (= (- py y) (- px x)) (= (- py y) (- x px)))))))
; (define (nqueen n)
; (let recur ((x (- n 1)))
; (if (= x -1)
; (yield '())
; (for* ([xys (in-generator (recur (- x 1)))]
; [y (range n)])
; (and (safe? x y xys)
; (yield (cons (list x y) xys)))))))
; (for ([e (in-generator (nqueen 8))])
; (displayln e))