Маленькая ошибка drracket не может ссылаться на идентификатор перед его определением
Вопрос для новичка, только что запустил небольшую книгу о программистах и установил DrRacket на мой macbook, чтобы попробовать некоторые примеры кода.
Если я выберу язык ракетки, следующий код
#lang Racket
(define (atom? x)
(and (not (pair? x)) (not (null? x))))
(atom? '())
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)) )
(else #f))))
(lat? (a b))
вызовет сообщение об ошибке:
a: unbound identifier in module in: a
если я выберу язык R5RS,
#lang R5RS
(define (atom? x)
(and (not (pair? x)) (not (null? x))))
(atom? '())
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)) )
(else #f))))
(lat? (a b))
Я получил сообщение об ошибке:
#%plain-module-begin: illegal use (not a module body) in: (#%plain-module-begin (module configure-runtime racket/base (require r5rs/init)) (define (atom? x) (and (not (pair? x)) (not (null? x)))) (atom? (quote ())) (define lat? (lambda (l) (cond ((null? l) #t) ((atom? (car l)) (lat? (cdr l))) (else #f)))) (lat? (a b)))
Кто-нибудь знает, что я сделал не так?
Спасибо
1 ответ
Похоже, что последний звонок должен быть
(lat? '(a b))
... нет?
(Также: я бы рекомендовал использовать #lang racket в целом, но я сильно подозреваю, что ваша проблема R5RS возникает из-за того, что вы "настраиваете язык дважды"; если вы запускаете свою программу с #lang R5RS, вам не нужно менять уровень языка. И наоборот, если вы установите уровень языка, вы не должны запускать свою программу с #lang R5RS. Если вы сделаете оба, я думаю, вы получите сообщение об ошибке, которое вы видели.)