чтение файла: неправильный синтаксис (несколько выражений после идентификатора) - PullRequest
1 голос
/ 29 декабря 2011
(define bootstrap-c-code
    (define (from-file file-name)
       (let* ((ip (open-input-file file-name))
            (res (read-text-file-from-input-port ip)))
         (close-input-port ip)
         res))
    (from-file "llvm.c"))

Ошибка: определить: неверный синтаксис (несколько выражений после идентификатора)

Но я не вижу в этом ничего плохого. Может кто-нибудь объяснить / исправить это, пожалуйста.

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

Непонятно, что вы намеревались с помощью приведенного выше кода. Если вы пытались загрузить текстовый файл и оставить загруженное значение в переменной с именем bootstrap-c-code, попробуйте следующее:

(define bootstrap-c-code
  (let ((from-file
         (lambda (file-name)
           (let* ((ip (open-input-file file-name))
                  (res (read-text-file-from-input-port ip)))
             (close-input-port ip)
             res))))
    (from-file "llvm.c")))

Конечно, определение from-file будет видно только внутри let, если вам нужно использовать его снаружи, define вне всего выражения. Если вам нужна только функциональность from-file внутри let, вы можете получить тот же результат гораздо более простым способом:

(define bootstrap-c-code
  (let* ((ip  (open-input-file "llvm.c"))
         (res (read-text-file-from-input-port ip)))
    (close-input-port ip)
    res))

С другой стороны, если вы намеревались создать процедуру с именем bootstrap-c-code, то правильный синтаксис будет:

(define (bootstrap-c-code)
  (define (from-file file-name)
    (let* ((ip (open-input-file file-name))
           (res (read-text-file-from-input-port ip)))
      (close-input-port ip)
      res))
  (from-file "llvm.c"))
1 голос
/ 29 декабря 2011

Согласно R5RS , внутренние определения могут появляться только в начале множества форм, таких как let, let *, lambda и т. Д. В случае вашего кода это не так, посколькуу вас есть внутреннее определение внутри непроцедурного определения.Вы можете исправить это, связав `bootstrap-c-code 'с процедурой.

...