1 Welcome to PLT Scheme
2 Scheme Essentials
3 Built-In Datatypes
4 Expressions and Definitions
5 Programmer-Defined Datatypes
6 Modules
7 Contracts
8 Input and Output
9 Regular Expressions
10 Exceptions and Control
11 Iterations and Comprehensions
12 Pattern Matching
13 Classes and Objects
14 Units (Components)
15 Reflection and Dynamic Evaluation
16 Macros
17 Performance
18 Running and Creating Executables
19 Compilation and Configuration
20 More Libraries
Bibliography
Index
Version: 4.0.2

 

3.7 Keywords

A keyword value is similar to a symbol (see Symbols), but its printed form is prefixed with #:.

Reading Keywords in Reference: PLT Scheme documents the fine points of the syntax of keywords.

Examples:

  > (string->keyword "apple")

  #:apple

  > '#:apple

  #:apple

  > (eq? '#:apple (string->keyword "apple"))

  #t

More precisely, a keyword is analogous to an identifier; in the same way that an identifier can be quoted to produce a symbol, a keyword can be quoted to produce a value. The same term “keyword” is used in both cases, but we sometimes use keyword value to refer more specifically to the result of a quote-keyword expression or of string->keyword. An unquoted keyword is not an expression, just as an unquoted identifier does not produce a symbol:

Examples:

  > not-a-symbol-expression

  reference to undefined identifier: not-a-symbol-expression

  > #:not-a-keyword-expression

  eval:4:0: #%datum: keyword used as an expression in:

  #:not-a-keyword-expression

Despite their similarities, keywords are used in a different way than identifiers or symbols. Keywords are intended for use (unquoted) as special markers in argument lists and in certain syntactic forms. For run-time flags and enumerations, use symbols instead of keywords. The example below illustrates the distinct roles of keywords and symbols.

Examples:

  > (define dir (find-system-path 'temp-dir)) ; not '#:temp-dir

  > (with-output-to-file (build-path dir "stuff.txt")

      (lambda () (printf "example\n"))

      ; optional #:mode argument can be 'text or 'binary

      #:mode 'text

      ; optional #:exists argument can be 'replace, 'truncate, ...

      #:exists 'replace)