---
name: "s9e"
section: "1"
platform: "linux"
package: "scheme9"
version: "2009.09.06-3"
release: "Debian 6.0 (Squeeze)"
platforms: ["linux"]
url: "https://new.carta.tech/s9e"
---

# s9e(1)

```
NAME
```

**s9e** - Extended Scheme Interpreter

```
USAGE
```

**s9e \[-h?\] \[-gnqv\] \[-m size\[m\]\] \[-f program\] \[-d image\] \[-i\]**     **\[-- argument ...\]**

```
DESCRIPTION
```

**Scheme 9 from Empty Space** is an interpreter for a broad subset of R4RS Scheme. The **s9e** command starts the extended interpreter. The extended interpreter defines some functions that are not defined in the Scheme Reports, but may prove useful in \`\`real-world'' programming.

```
EXTENDED PRIMITIVE FUNCTIONS
```

**Do not use these primitives directly. Use the user-level procedures** **outlined in the next section instead.**

Procedures typically indicate failure by returning **#f**. Procedures that would not otherwise return a more meaningful value return **#t** in case of success. When a procedure fails, the resulting Unix error number can be retrieved by calling **unix:errno** (or **errno**).

**(unix:chdir string) ==\> boolean** Change the current working directory to *string*.\
 **(unix:chmod string integer) ==\> boolean** Change the access bits of the file *string* to the mode *integer*.\
 **(unix:chown string integer1 integer2) ==\> boolean** Change the ownership for the file *string* to user ID *integer1* and the group ID *integer2*.\
 **(unix:command-line) ==\> list of string** Return the command line arguments passed to **s9e** *after* the "--" argument.\
 **(unix:errno) ==\> integer** Return the Unix error code set by the most recently failed call to a **unix** extension procedure.\
 **(unix:exit integer) ==\> undefined** Terminate the **s9e** process and return *integer* as an exit code to the calling process.\
 **(unix:flush output-port) ==\> boolean** Flush the given output port.\
 **(unix:getcwd) ==\> string** Return the current working directory.\
 **(unix:getenv string) ==\> string** Return the value of the environment variable *string*. If the variable is undefined, return **#f**.\
 **(unix:getgid) ==\> integer** Return the group ID of the **s9e** process.\
 **(unix:getgrnam string) ==\> alist** Return the group record for the group name *string*. The returned association list has the following members:

```
((name . string)    ; group name
 (gid  . integer))  ; group ID
```

**(unix:getgrgid integer) ==\> alist** Return the group record for the group ID *integer*. See **unix:getgrnam** for the structure of the return value.\
 **(unix:getpwent) ==\> list** Return a list of all users of the system.\
 **(unix:getpwnam string) ==\> alist** Return the password record for the user name *string*. The returned association list has the following members:

```
((name  . string)   ; user name
 (uid   . integer)  ; user ID
 (gid   . integer)  ; group ID
 (gecos . string)   ; real name
 (home  . string)   ; home directory
 (shell . string))  ; default shell
```

**(unix:getpwuid integer) ==\> alist** Return the password record for the user ID *integer*. See **unix:getpwnam** for the structure of the return value.\
 **(unix:getuid) ==\> integer** Return the user ID of the **s9e** process.\
 **(unix:link string1 string2) ==\> boolean** Create a (hard) link *string2* that refers to the same file as *string1*.\
 **(unix:lock string) ==\> boolean** Create a lock file named \`\`*string*.lock''. If the file already exists when the function is called, return **#f**, else return **#t**. **Unix:lock** uses *mkdir()* to create the lock file, which is atomic on virtually all systems.\
 **(unix:mkdir string integer) ==\> boolean** Create directory *string* with mode *integer*.\
 **(unix:readdir string) ==\> string** Return a list of all file names contained in the directory *string*. When the given directory does not exist, return **#f**.\
 **(unix:readlink string) ==\> string** Return the destination of the symbolic link *string*.\
 **(unix:rmdir string) ==\> boolean** Remove directory *string*.\
 **(unix:spawn string) ==\> (input-port output-port)** Spawn an inferior process running the command *string*. Return a list of two file descriptors where the first one can be used to read the output of the command and the second one to send input to the command. The command will be executed using\
 `execl("/bin/sh", "/bin/sh", "-c", `*string*`, NULL);`\
 **(unix:stat string) ==\> alist** Return the file status of the file *string*. The returned association list has the following members:

```
((name  . string)    ; file name
 (size  . integer)   ; size in bytes
 (uid   . integer)   ; UID of owner
 (gid   . integer)   ; GID of owner
 (mode  . integer)   ; access bits
 (ctime . integer)   ; inode change time
 (atime . integer)   ; access time
 (mtime . integer)   ; modification time
 (dev   . integer)   ; device ID of containing device
 (ino   . integer)   ; inode number
 (nlink . integer))  ; number of (hard) links
```

**(unix:symlink string1 string2) ==\> boolean** Create a symbolic link *string2* that points to the path *string1*.\
 **(unix:system string) ==\> boolean** Run the command *string* and return its exit status (**#t** for success and **#f** for failure).\
 **(unix:time) ==\> integer** Returns the number of seconds since the Unix epoch.\
 **(unix:unlink string) ==\> boolean** Remove the file name *string*.\
 **(unix:unlock string) ==\> unspecific** Remove the file \`\`*string*.lock''. If the files does not exist, do nothing.\
 **(unix:utimes string) ==\> boolean** Set the access and modification time of the file *string* to the current time.\

```
USER-LEVEL FUNCTIONS
```

Use these instead of the above primitives.

**(chdir string) ==\> boolean** See **unix:chdir**.

**(chmod string1 integer\|string2) ==\> boolean** Change the mode of the file *string1* to *integer* or *string2.* When an integer mode is specified, use its numeric value. A string mode must either represent an octal mode or have the format

*user+bits* or *user-bits*

where *user* is any combination of the letters *ugo* (denoting *user*, *group*, and *others*), and *bits* is any combinations of the letters *rwx* (denoting *read*, *write*, and *execute* permission, respectively). The letter *a* may be used to abbreviate *ugo*. For example,

**(chmod "a+rw" "file")**

will add read and write permission to *file*. Using a minus sign instead of a plus sign will remove the given permissions.

**(chown string integer1\|string1\|#f integer2\|string2\|#f)**\
 **==\> boolean** Change the owning user of the file *string* to *string1* or *integer1* and the owning group of the file to *string2* or *integer2*. Numeric values will be interpreted as user IDs and strings will be interpreted as user names. Replacing either the user or the group part with **#f** will leave that part unchanged. For instance,

**(chown #f "wheel" "file")**

will change the group of *file* to *wheel*, but leave its user unchanged.

**(command-line) ==\> list of string** See **unix:command-line**.

**(errno) ==\> integer** See **unix:errno**.

**(exit integer) ==\>** See **unix:exit**. However, the argument of **exit** is optional and a return value of 0 is the default.

**(flush output-port) ==\> boolean** See **unix:flush**.

**(format-time string time-list) ==\> string \| #f** Format a time specification as returned by **unix-time-\>time** according to the description in *string*. This a poor man's Common LISP **format**-style procedure intended for making time lists more readable. It returns **#f** if *time-list* is not a proper time list or *string* is erroneous (i.e.: contains a wrong format descriptor).

The following format descriptors are supported:

```
~w   day of week (Mon, Tue, ...)
~y   year
~:m  number of month
~@m  month name (Jan, Feb, ...)
~h   hour
~m   minute
~s   second
~~   literal ~
```

When a single digit appears between a *~* and the rest of a format descriptor, this digit will be interpreted as a length and the resulting string will be padded to this length with zeros.

Example:

```
(format-time "~w ~4y-~@m-~2d ~2h:~2m:~2s"
             '(1 2009 3 9 8 53 20))
  ==> "Tue 2009-Apr-09 08:53:20"
```

**(getcwd) ==\> string** See **unix:getcwd**.

**(getenv string) ==\> string** See **unix:getenv**.

**(getgid) ==\> integer** See **unix:getgid**.

**(getgrnam string) ==\> alist** See **unix:getgrnam.**

**(getgrgid integer) ==\> alist** See **unix:getgrgid.**

**(getpwent) ==\> list** See **unix:getpwent**.

**(getpwnam string) ==\> alist** See **unix:getpwnam.**

**(getpwuid integer) ==\> alist** See **unix:getpwuid.**

**(getuid) ==\> integer** See **unix:getuid.**

**(group-name string\|integer) ==\> string** Return the group name for the group **string** or the group ID **integer**. (Yes, getting a group name for a group name is an identity operation.)

**(group-gid string\|integer) ==\> string** Return the group ID for the group **string** or the group ID **integer**. (Yes, getting a group ID for a group ID is an identity operation.)

**(link string1 string2) ==\> boolean** See **unix:link.**

**(lock string) ==\> boolean** See **unix:lock.**

**(mkdir string integer) ==\> boolean** See **unix:mkdir.**

**(readdir string) ==\> list** See **unix:readdir.**

**(readlink string) ==\> string** See **unix:readlink.**

**(rmdir string) ==\> boolean** See **unix:rmdir.**

**(spawn string) ==\> (input-port output-port)** See **unix:spawn.**

**(stat string) ==\> alist** See **unix:stat.**

**(stat-name string) ==\> string** Return the file name of the file **string**.

**(stat-size string) ==\> integer** Return the size of the file **string**.

**(stat-uid string) ==\> integer** Return the UID of the owner of the file **string**.

**(stat-gid string) ==\> integer** Return the GID of the owning group of the file **string**.

**(stat-mode string) ==\> integer** Return the permission bits of the file **string**.

**(stat-ctime string) ==\> integer** Return the inode change time of the file **string**.

**(stat-atime string) ==\> integer** Return the access time of the file **string**.

**(stat-mtime string) ==\> integer** Return the modification time of the file **string**.

**(stat-dev string) ==\> integer** Return the device ID of the device on which the file **string** resides.

**(stat-ino string) ==\> integer** Return the inode number of the file **string**.

**(stat-nlink  string) ==\> integer** Return the link count of the file **string**.

**(symlink string1 string2) ==\> boolean** See **unix:symlink.**

**(system string) ==\> boolean** See **unix:system.**

**(time) ==\> integer** See **unix:time**.

**(time-\>unix-time time-list) ==\> integer \| #f** Convert a time list as described in **unix-time-\>time** to the number of seconds since the Unix epoch. Return **#f** if *time-list* is not a proper time list.

**(unix-time-\>time integer) ==\> time-list** Convert the number of seconds since the Unix epoch given as the *integer* argument to a more useful representation:

```
(weekday  ; 0..6 where 0 = Monday
 year     ; 1970..2038
 month    ; 1..12
 day      ; 1..31, depends on month
 hour     ; 0..23
 minute   ; 0..60
 second)  ; 0..60
```

**(unlink string) ==\> boolean** See **unix:unlink.**

**(unlock string) ==\> unspecific** See **unix:unlock.**

**(user-name integer\|string) ==\> string** Return the user name for the user **string** or the user ID **integer**. (Yes, getting a user name for a user name is an identity operation.)

**(user-uid integer\|string) ==\> integer** Return the user ID for the user **string** or the user ID **integer**. (Yes, getting a user ID for a user ID is an identity operation.)

**(user-gid integer\|string) ==\> integer** Return the group ID for the user **string** or the user ID **integer**.

**(user-gecos integer\|string) ==\> string** Return the GECOS information (full name) for the user **string** or the user ID **integer**.

**(user-home integer\|string) ==\> string** Return the home directory for the user **string** or the user ID **integer**.

**(user-shell integer\|string) ==\> string** Return the login shell for the user **string** or the user ID **integer**.

**(utimes string) ==\> boolean** See **unix:utimes.**

```
SEE ALSO
```

[s9(1)](/s9/1.md)

```
AUTHOR
```

Nils M Holm \<nmh@t3x.org\>
