Я нашел код для генерации ковра Серпинского на http://rosettacode.org/wiki/Sierpinski_carpet#Scheme - но он не будет работать в среде DrRacket или WeScheme. Может ли кто-нибудь предоставить решения для любой среды?
Похоже, что этот код прекрасно работает в DrRacket после добавления
#lang racket
строка, указывающая, что код написан на Racket. Я могу предоставить более подробную информацию, если этого недостаточно.
Я перевел программу для запуска под WeScheme.Я сделал несколько изменений: вместо использования (display) и (newline) я использую примитивы изображений, которые предоставляет WeScheme, чтобы сделать картинку немного лучше.Вы можете просмотреть запущенную программу и ее исходный код .Для удобства я также включил источник здесь:
;; Sierpenski carpet. ;; http://rosettacode.org/wiki/Sierpinski_carpet#Scheme (define SQUARE (square 10 "solid" "red")) (define SPACE (square 10 "solid" "white")) (define (carpet n) (local [(define (in-carpet? x y) (cond ((or (zero? x) (zero? y)) #t) ((and (= 1 (remainder x 3)) (= 1 (remainder y 3))) #f) (else (in-carpet? (quotient x 3) (quotient y 3)))))] (letrec ([outer (lambda (i) (cond [(< i (expt 3 n)) (local ([define a-row (letrec ([inner (lambda (j) (cond [(< j (expt 3 n)) (cons (if (in-carpet? i j) SQUARE SPACE) (inner (add1 j)))] [else empty]))]) (inner 0))]) (cons (apply beside a-row) (outer (add1 i))))] [else empty]))]) (apply above (outer 0))))) (carpet 3)
Вот модифицированный код для WeScheme.WeScheme не поддерживает синтаксис do-loop, поэтому я использую развернуть из srfi-1 вместо
(define (unfold p f g seed) (if (p seed) '() (cons (f seed) (unfold p f g (g seed))))) (define (1- n) (- n 1)) (define (carpet n) (letrec ((in-carpet? (lambda (x y) (cond ((or (zero? x) (zero? y)) #t) ((and (= 1 (remainder x 3)) (= 1 (remainder y 3))) #f) (else (in-carpet? (quotient x 3) (quotient y 3))))))) (let ((result (unfold negative? (lambda (i) (unfold negative? (lambda (j) (in-carpet? i j)) 1- (1- (expt 3 n)))) 1- (1- (expt 3 n))))) (for-each (lambda (line) (begin (for-each (lambda (char) (display (if char #\# #\space))) line) (newline))) result))))