I’m fairly new to common lisp and have been doing Exercism exercises to get into it.
I’m using debian on wsl2 on windows 10.
I have sbcl 2.1.1 with quicklisp
Here is the file I’m trying to load
(defpackage :lillys-lasagna-leftovers
(:use :cl)
(:export
:preparation-time
:remaining-minutes-in-oven
:split-leftovers))
(in-package :lillys-lasagna-leftovers)
(defun preparation-time (&rest rest)
(* 19 (length rest)))
(defun remaining-minutes-in-oven (&optional (opt :normal opt-provided))
(if opt-provided (cond
((eql opt :shorter) 337)
((eql opt :very-short) 137)
((eql opt :longer) 437)
((eql opt :very-long) 537)
(t nil))
opt))
Aside from the issues which could arise if the second function is incorrect.
I have tried loading the above file in two ways
-
By entering sbcl and using
(load "test-file-name")
(preparation-time 1 2 3)
-
By loading the file into sbcl
sbcl –load "test-file-name"
(preparation-time 1 2 3)
In both cases I get
Linedit version 0.17.6, smart mode, ESC-h for help.
CL-USER(1): (preparation-time)
; in: PREPARATION-TIME
; (PREPARATION-TIME)
;
; caught STYLE-WARNING:
; undefined function: COMMON-LISP-USER::PREPARATION-TIME
;
; compilation unit finished
; Undefined function:
; PREPARATION-TIME
; caught 1 STYLE-WARNING condition
What am I doing wrong? I want to have a way in which I can test my code locally.
2
Answers
Use
The function
PREPARATION-TIME
has been exported from packageLILLYS-LASAGNA-LEFTOVERS
.When you write a symbol without a package prefix, the reader uses the current package (and other reader settings) to decide what symbol it refers to. When you start SBCL, the current package is named CL-USER.
Your function is named by the string
PREPARATION-TIME
in a package namedLILLYS-LASAGNA-LEFTOVERS
. If you are in the CL-USER package, and you want to refer to it, you can do this:(lillys-lasagna-leftovers::preparation-time 1 2 3)
– this will work on symbols regardless of their external status(lillys-lasagna-leftovers:preparation-time 1 2 3)
– this syntax with only one colon works because you used:export
to make the symbol externalIf you’d like to refer to
preparation-time
without a package prefix, there are a few options:(use-package :lilys-lasagna-leftovers)
will make the current package inherit all external symbols, which includespreparation-time
– this can fail if a different, non-eq symbol is already accessible by the same name(import 'lilys-lasagna-leftovers:preparation)
will make that symbol present in the current package, so it can be referred to without a prefix – this can fail if a different, non-eq symbol is already accessible by the same name(shadowing-import 'lilys-lasagna-leftovers:preparation)
will make that symbol present in the current package, and additionally override any previously accessible symbols with the same name(in-package :lilys-lasagna-leftovers)
will change the value of*package*
so symbol lookups without a package prefix are relative to your packageOf all these options, if I were working on this project, I would most likely use
in-package
. The other options have their most appropriate uses as well, but you can usually start within-package
and move on to other things as the need arises.