2011-12-29 3 views
2
(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

Непонятно, что вы намеревались с вышеуказанным кодом. Если вы пытаетесь загрузить текстовый файл и оставить загруженное значение в переменной называется 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

Спасибо! Мне нужен второй вариант с (bootstrap-c-code) – Cynede

+0

Хорошо! Затем рассмотрите передачу «llvm.c» в качестве параметра функции, вместо жесткого кодирования значение –

+0

, но подождите ... это не работает :(ссылка на неопределенный идентификатор: read-text-file-from-input-port – Cynede

1

According to R5RS Внутренние определения могут возникать только в начале множества форм, таких как let, let *, лямбда и т. Д. В случае вашего кода это не так, поскольку у вас есть внутреннее определение внутри непроцедурное определение. Вы можете исправить это, выполнив привязку «bootstrap-c-code» к процедуре.