3.7 Keywords

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

+Reading Keywords in Reference: Racket 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:2: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)