Я прохожу практический Common Lisp, используя Racket. Я пытаюсь написать функцию, которая запрашивает у пользователя ввод данных и повторяет их, если они не вводят «да / у», «нет / н».
(define (y-or-n? (text ""))
(if (string=? text "") (display "[y/n]: ") (display (~a text "[y/n]: " #:separator " ")))
(let ([resp (string-downcase (read-line))] [input text])
(cond
[(or (equal? resp "y") (equal? resp "yes")) #t]
[(or (equal? resp "n") (equal? resp "no")) #t]
[else (displayln "please enter yes/y no/n ") (y-or-n? input)])))
Он делает почти то же, что и я, за исключением одной ошибки. Вызов
pcl.rkt> (y-or-n? "ripped?")
ripped? [y/n]: incorrect-answer
please enter yes/y no/n
ripped? [y/n]: y
y
#t
; y: undefined;
; cannot reference an identifier before its definition
; in module: "/home/user/Documents/Programming/Lisp/Racket/pcl.rkt"
; internal name: y
; Context:
; /usr/share/racket/collects/racket/repl.rkt:11:26
pcl.rkt>
Я должен дважды нажать Enter, чтобы ответ был принят, и это дает мне несвязанную ошибку идентификатора. Кто-нибудь знает, что не так?
P.S Я использую Racket V 7.0. Работа в режиме ракетки в Emacs.