Ошибка определения схемы (короткая)

Это часть переводчика, который я делаю. Я продолжаю получать эту ошибку:

define not allowed in an expression context in: (define ret1 (list->string wl))

Я использую DrScheme версии 371, языковой стандарт (R5RS).

(define (read-command)
  (set! com '( '() ))
  (set! wl (read-as-list))
  (define ret1 (list->string wl))
  (commRead)
  ret1
 )

похожая проблема здесь:

    (define repl(
                 lambda()
                  (display "\nUofL>")
                  (define inp (read-command))
                  (define lengtha (length com)

1 ответ

Решение

В вашем интерпретаторе, кажется, что определения могут появляться только в начале функции. Вы должны использовать let* вместо:

(define (read-command)
  (let* ((com '('())) ; are you sure you didn't mean '(()) ?
         (wl (read-as-list))
         (ret1 (list->string wl)))
  (commRead ret1)))

Для второй проблемы попробуйте это:

(define repl
  (lambda ()
    (display "\nUofL>")
    (let ((inp (read-command))
          (lengtha (length com)))
      ; return a value here
      )))

Как примечание, ваш код, кажется, написан в процедурном стиле - со всеми этими set! и вызовы функций выполняются для эффекта. Как на земле ret1 будет изменено, если вы не передадите его в качестве параметра commRead? Я бы посоветовал вам прочитать хорошую книгу по программированию на Scheme и начать писать код в более функциональном стиле, в настоящее время ваш код не идиоматичен, и у вас рано или поздно возникнут проблемы.

Другие вопросы по тегам