I'm having an issue with BSL. I want to divide my code into separate auxiliary files and use
(require "auxiliary-function.rkt")
at the beginning to import the separated code into the definitions area. However it doesn't work as supposed. Though no explicit error given, it seems like that that DrRacket simply doesn't see the code in the separate file and all I see is the error
<auxiliary-function-name>: this function is not defined
Apparently,
(provide x)
is not included in BSL. I've read the manual and this answer but it’s still not clear how to make this work. Is this even possible in BSL?
Thanks!
Note that if you're doing this for a course this strategy might not be accepted for a submission.
What I have done for some of my own projects is a pattern like this:
Have one file written in plain Racket, called "provide.rkt"
, like this:
; provide.rkt
#lang racket
(provide provide all-defined-out)
Then you can use this to either provide specific functions or provide all definitions from a file.
For providing specific functions
In your "library" BSL file, you can require provide into it like this, and use that to provide the specific function(s) you want:
; <auxiliary-library>.rkt
; written in BSL
(require "provide.rkt")
(provide <auxiliary-function-name>)
(define (<auxiliary-function-name> ....) ....)
And finally, in your "main" BSL file, you can require the library like this:
; written in BSL
(require "<auxiliary-library>.rkt")
(<auxiliary-function-name> ....)
For providing all definitions from a file
In your "library" BSL file, you can require provide into it and use that to provide everything:
; <auxiliary-library>.rkt
; written in BSL
(require "provide.rkt")
(provide (all-defined-out))
(define (<auxiliary-function-name-1> ....) ....)
(define (<auxiliary-function-name-2> ....) ....)
...
Then in your "main" BSL file, you can require the library and get all of the definitions:
; written in BSL
(require "<auxiliary-library>.rkt")
(<auxiliary-function-name-1> ....)
(<auxiliary-function-name-2> ....)
...
BSL is not for you. If you know how to manage modules, I recommend you use full-fledged Racket.
If you wish to create auxiliary libraries, I recommend you develop them in full Racket, provide the identifiers you need, use htdp/error to formulate error messages, and 'require' will then work.