1
votes
(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"))

Error : define: bad syntax (multiple expressions after identifier)

But I can't see anything wrong with it. Can someone explain / fix it please.

2

2 Answers

1
votes

It's not clear what you intended with the above code. If you were trying to load a text file and leave the loaded value in a variable called bootstrap-c-code, then try this:

(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")))

Of course, the from-file definition will only be visible inside the let, if you need to use it outside, define it outside of the whole expression. If you only need the functionality of from-file inside the let, you can obtain the same result in a much simpler way:

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

On the other hand, if what you intended was to create a procedure called bootstrap-c-code, then the correct syntax would be:

(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
votes

According to R5RS, internal definitions can occur only at the beginning of the of a bunch of forms like let, let*, lambda etc. In the case of your code, that is not the case since you have an internal definition inside a non-procedural define. You could fix it by making `bootstrap-c-code' bind to a procedure.