Guile and Scheme Information#


There are many places you can go to find out more regarding Guile and the Scheme programming language. We list a few of them here.

Scheme#

Scheme is a simplified derivative of Lisp, and is a small and beautiful dynamically typed, lexically scoped, functional language.

Guile#

Guile is a free/open-source implementation of Scheme, designed to be plugged in to other programs as a scripting language.

  • The homepage for the GNU Guile project.
  • See parts IV and V of the Guile Reference Manual for additional Scheme functions and types defined within the Guile environment.

How to Write a Loop in Scheme#

The most frequently asked question seems to be: how do I write a loop in Scheme? We give a few answers to that here, supposing that we want to vary a parameter x from a to b in steps of dx, and do something for each value of x.

The classic way, in Scheme, is to write a tail-recursive function:

(define (doit x x-max dx) (if (<= x x-max) (begin ...perform loop body with x... (doit (+ x dx) x-max dx)))) (doit a b dx) ; execute loop from a to b in steps of dx

There is also a do-loop construct in Scheme that you can use

(do ((x a (+ x dx))) ((> x b))...perform loop body with x...)

If you have a list of values of x that you want to loop over, then you can use map:

(map (lambda (x)...do stuff with x...)list-of-x-values)

How to Read In Values from a Text File in Scheme#

A simple command to read a text file and store its values within a variable in Scheme is read. As an example, suppose a file foo.dat contains the following text, including parentheses:

(1 3 12.2 14.5 16 18)

In Scheme, we would then use

(define port (open-input-file "foo.dat")) (define foo (read port)) (close-input-port port)

The variable foo would then be a list of numbers '(1 3 12.2 14.5 16 18).

Libctl Tricks Specific to Meep and MPB#

libctl has a couple of built-in functions arith-sequence and interpolate (see the User Reference) to construct lists of a regular sequence of values, which you can use in conjunction with map as above:

(map (lambda (x)...do stuff with x...) (arith-sequence x-min dx num-x))

or

(map (lambda (x)...do stuff with x...) (interpolate num-x (list a b)))

Finally, if you have an entire libctl input file myfile.ctl that you want to loop, varying over some parameter x, you can do so by writing a loop on the Unix command-line. Using the bash shell, you could do:

for x in `seq a dx b`; do meep x=$x myfile.ctl; done