# O

`*ObjIdx`
  Holds an `idx` tree of objects created by `obj`.

`*Once`
  Holds an `idx` tree of already `load`ed source locations (as returned by `file`) See also `once`.

      : *Once
      -> (("lib/" "misc.l" . 11) (("lib/" "http.l" . 9) (("lib/" "form.l" . 11))))

`*OS`
  A global constant holding the name of the operating system. Possible values include `"Linux"`, `"Android"`, `"FreeBSD"`, `"OpenBSD"`, `"SunOS"`, `"Darwin"` or `"Cygwin"`. See also `*CPU` and `version`.

      : *OS
      -> "Linux"

`(obj (typ sym [hook] val ..) [var1 val1 ..]) -> obj`
`(obj typ any [var1 val1 ..]) -> obj`
  Finds or creates a database object, and initializes additional properties using the `varN` and `valN` arguments. In the first form, a `request` for `(typ sym [hook] val ..)` is called, while the second form uses `cache` to maintain objects without unique `+Key`s by indexing `*ObjIdx` with the `any` argument.

      : (obj ((+Item) nr 2) nm "Spare Part" sup `(db 'nr '+CuSu 2) inv 100 pr 1250)
      -> {B2}

`(object 'sym 'any ['sym2 'any2 ..]) -> obj`
  Defines `sym` to be an object with the value (or type) `any`. The property list is initialized with all optionally supplied key-value pairs. See also OO Concepts, `new`, `type` and `isa`.

      : (object 'Obj '(+A +B +C) 'a 1 'b 2 'c 3)
      -> Obj
      : (show 'Obj)
      Obj (+A +B +C)
         c 3
         b 2
         a 1
      -> Obj

`(oct 'num ['num]) -> sym`
`(oct 'sym) -> num`
  Converts a number `num` to an octal string, or an octal string `sym` to a number. In the first case, if the second argument is given, the result is separated by spaces into groups of such many digits. See also `bin`, `hex`, `hax` and `format`.

      : (oct 73)
      -> "111"
      : (oct "111")
      -> 73
      : (oct 1234567 3)
      -> "4 553 207"

`(off var ..) -> NIL`
  Stores `NIL` in all `var` arguments. See also `on`, `onOff`, `zero` and `one`.

      : (off A B)
      -> NIL
      : A
      -> NIL
      : B
      -> NIL

`(offset 'lst1 'lst2) -> cnt | NIL`
  Returns the `cnt` position of the tail list `lst1` in `lst2`, or `NIL` if it is not found. See also `index`, `sub?` and `tail`.

      : (offset '(c d e f) '(a b c d e f))
      -> 3
      : (offset '(c d e) '(a b c d e f))
      -> NIL

`(on var ..) -> T`
  Stores `T` in all `var` arguments. See also `off`, `onOff`, `zero` and `one`.

      : (on A B)
      -> T
      : A
      -> T
      : B
      -> T

`(once . prg) -> any`
  Executes `prg` once, when the current file is `load`ed the first time. Subsequent loads at a later time will not execute `prg`, and `once` returns `NIL`. See also `*Once` and `finish`.

      (once
         (zero *Cnt1 *Cnt2)  # Init counters
         (load "file1.l" "file2.l") )  # Load other files

      `(once T)  # Ignore next time the rest of this file

`(one var ..) -> 1`
  Stores `1` in all `var` arguments. See also `zero`, `on`, `off` and `onOff`.

      : (one A B)
      -> 1
      : A
      -> 1
      : B
      -> 1

`(onOff var ..) -> flg`
  Logically negates the values of all `var` arguments. Returns the new value of the last symbol. See also `on`, `off`, `zero` and `one`.

      : (onOff A B)
      -> T
      : A
      -> T
      : B
      -> T
      : (onOff A B)
      -> NIL
      : A
      -> NIL
      : B
      -> NIL

`(open 'any ['flg]) -> cnt | NIL`
  Opens the file with the name `any` in read/write mode (or read-only if `flg` is non-`NIL`), and returns a file descriptor `cnt` (or `NIL` on error). A leading "`@`" character in `any` is substituted with the PicoLisp Home Directory, as it was remembered during interpreter startup. If `flg` is `NIL` and the file does not exist, it is created. The file descriptor can be used in subsequent calls to `in` and `out`. See also `close` and `poll`.

      : (open "x")
      -> 3

`(opid) -> pid | NIL`
  Returns the corresponding process ID when the current output channel is writing to a pipe, otherwise `NIL`. See also `ipid` and `out`.

      : (out '(cat) (call 'ps "-p" (opid)))
        PID TTY          TIME CMD
       7127 pts/3    00:00:00 cat
      -> T

`(opt) -> sym`
  Return the next command line argument ("option", as would be processed by `load`) as a string, and remove it from the remaining command line arguments. See also Invocation and `argv`.

      $ pil  -"de f () (println 'opt (opt))"  -f abc  -bye
      opt "abc"

`(or 'any ..) -> any`
  Logical OR. The expressions `any` are evaluated from left to right. If a non-`NIL` value is encountered, it is returned immediately. Else the result of the last expression is returned. See also `nor`, `and` and `unless`.

      : (or (= 3 3) (read))
      -> T
      : (or (= 3 4) (read))
      abc
      -> abc

`or/2`
  Pilog predicate that takes an arbitrary number of clauses, and succeeds if one of them can be proven. See also `not/1`.

      : (?
         (or
            ((equal 3 @X) (equal @X 4))
            ((equal 7 @X) (equal @X 7)) ) )
       @X=7
      -> NIL

`(out 'any . prg) -> any`
  Opens `any` as output channel during the execution of `prg`. The current output channel will be saved and restored appropriately. If the argument is `NIL`, standard output is used. If the argument is a symbol, it is used as a file name (opened in read/write-append mode if the first character is "`+`"). If it is a positive number, it is used as the descriptor of an open file. If it is a negative number, the saved output channel such many levels above the current one is used. Otherwise (if it is a list), it is taken as a command with arguments, and a pipe is opened for output. The (system dependent) exit status code of the child process is stored in the global variable `@@`. In all cases, `flush` is called when `prg` is done. See also `in`, `err`, `fd`, `opid`, `call`, `ctl`, `pipe`, `poll`, `close` and `load`.

      : (out "a" (println 123 '(a b c) 'def))  # Write one line to file "a"
      -> def
      : (out '(lpr) (prinl "Hello"))  # Send line to line printer
      -> "Hello"

`(output exe . prg) -> any`
  Establishes an output stream, by redirecting the current output channel during the execution of `prg`. The current output channel will be saved and restored appropriately. `exe` is executed (in the context of the original output channel) whenever a character needs to be output by print calls in `prg`. That character is passed in the global variable `@@`, and the following character in the stream in `@@@` (single-character look-ahead). See also `input`, `out` and `pipe`.

      : (output (prin (uppc @@)) (prinl "abc"))
      ABC
      -> "abc"
      : (output (println @@ @@@) (prin "abc"))
      "a" "b"
      "b" "c"
      "c" NIL
      -> "abc"
      : (pack
         (make
            (output (link @@)
               (print '(+ 2 (* 3 4))) ) ) )
      -> "(+ 2 (* 3 4))"
      : (pack
         (make
            (let L (1 2 3 4 5 6 7)
               (output (link @@)
                  (while L
                     (ext:Base64 (++ L) (++ L) (++ L)) ) ) ) ) )
      -> "AQIDBAUGBw=="