# Functions, Procedures and Packages

- [Introduction](introduction.md)

- [Functions and Procedures](function-procedure.md)

  - [Functions](function-procedure.md#functions)

    - [`function`](function-procedure.md#literal-literal-function-f-function-x1-xn-parameters-br-indent-statements-br-end-function)

    - [`function`](function-procedure.md#literal-literal-function-function-f-x1-xn-parameters-br-indent-statements-br-end-function)

    - [`func`](function-procedure.md#literal-literal-func-f-func-x1-xn-parameters-expression)

    - [`f := func< x₁, ..., xₙ, ... : parameters | expression >;`](function-procedure.md#literal-literal-f-func-x1-xn-parameters-expression-f-func-x1-xn-parameters-expression)

    - [`Example: Recursion`](function-procedure.md#example-ex-eb1a18)

    - [`Example: Parameters`](function-procedure.md#example-ex-6cad0c)

    - [`Example: Underscore`](function-procedure.md#example-ex-f4d48f)

    - [`Example: Variadic`](function-procedure.md#example-ex-1b08eb)

  - [Procedures](function-procedure.md#procedures)

    - [`procedure`](function-procedure.md#literal-literal-procedure-p-procedure-x1-xn-parameters-br-indent-statements-br-end-procedure)

    - [`procedure`](function-procedure.md#literal-literal-procedure-procedure-p-x1-xn-parameters-br-indent-statements-br-end-procedure)

    - [`proc`](function-procedure.md#literal-literal-proc-p-proc-x1-xn-parameters-expression)

    - [`p := proc< x₁, ..., xₙ, ... : parameters | expression >;`](function-procedure.md#literal-literal-p-proc-x1-xn-parameters-expression-p-proc-x1-xn-parameters-expression)

    - [`Example: Procedures`](function-procedure.md#example-ex-711cd6)

  - [The forward Declaration](function-procedure.md#the-forward-declaration)

    - [`forward`](function-procedure.md#literal-literal-forward-forward-f)

    - [`Example: forward`](function-procedure.md#example-ex-09aa09)

- [Packages](package.md)

  - [Introduction](package.md#introduction)

  - [Intrinsics](package.md#intrinsics)

    - [`intrinsic`](package.md#literal-literal-intrinsic-intrinsic-name-arguments-return-values-br-comment-text-br-indent-statements-br-end-intrinsic)

    - [`Example: intrinsic`](package.md#example-ex-82f54a)

  - [Resolving Calls to Intrinsics](package.md#resolving-calls-to-intrinsics)

    - [`Example: Intrinsic Lookup`](package.md#example-ex-45ec7c)

  - [Attaching and Detaching Package Files](package.md#attaching-and-detaching-package-files)

    - [`Attach(F): MonStgElt`](package.md#function-attach-monstgelt)

    - [`Detach(F): MonStgElt`](package.md#function-detach-monstgelt)

    - [`freeze;`](package.md#literal-literal-freeze-freeze)

  - [Related Files](package.md#related-files)

  - [Importing Constants](package.md#importing-constants)

    - [`import "filename": ident_list;`](package.md#literal-literal-import-import-filename-ident-list)

    - [`Example: import`](package.md#example-ex-2ff439)

  - [Argument Checking](package.md#argument-checking)

    - [`require condition: print_args;`](package.md#literal-literal-require-require-condition-print-args)

    - [`requirerange v, L, U;`](package.md#literal-literal-requirerange-requirerange-v-l-u)

    - [`requirege v, L;`](package.md#literal-literal-requirege-requirege-v-l)

    - [`Example: require`](package.md#example-ex-216764)

  - [The Number of Results](package.md#the-number-of-results)

    - [`NumberOfResults() → RngIntElt, [ BoolElt ]`](package.md#function-numberofresults)

    - [`Nresults() → RngIntElt, [ BoolElt ]`](package.md#function-nresults)

    - [`Example: Nresults`](package.md#example-ex-2485c6)

  - [Package Specification Files](package.md#package-specification-files)

    - [`AttachSpec(S): MonStgElt`](package.md#function-attachspec-monstgelt)

    - [`DetachSpec(S): MonStgElt`](package.md#function-detachspec-monstgelt)

    - [`Example: spec`](package.md#example-ex-69025d)

  - [User Startup Specification Files](package.md#user-startup-specification-files)

    - [`Example: Startup Spec`](package.md#example-ex-4f513b)

- [Attributes](attribute.md)

  - [Predefined System Attributes](attribute.md#predefined-system-attributes)

  - [User-defined Attributes](attribute.md#user-defined-attributes)

    - [`AddAttribute(C, F): Cat, MonStgElt → ;`](attribute.md#function-addattribute-cat-monstgelt)

    - [`declare attributes C: F₁,...,Fₙ;`](attribute.md#literal-literal-declare-attributes-declare-attributes-c-f1-fn)

  - [Accessing Attributes](attribute.md#accessing-attributes)

    - [`S`fieldname: Str, Fieldname → Elt`](attribute.md#literal-literal-s-fieldname-str-fieldname-elt)

    - [`S`` N: Str, Str → Elt`](attribute.md#literal-literal-s-n-str-str-elt)

    - [`assigned S`fieldname: Str, Fieldname → BoolElt`](attribute.md#operation-operation-assigned-str-fieldname-boolelt)

    - [`assigned S`` N: Str, Str → BoolElt`](attribute.md#operation-operation-assigned-str-str-boolelt)

    - [`S`fieldname := expression;`](attribute.md#literal-literal-s-fieldname-expression)

    - [`S`` N := expression;`](attribute.md#literal-literal-s-n-expression)

    - [`delete  S`fieldname;`](attribute.md#literal-literal-delete-delete-s-fieldname)

    - [`delete  S`` N;`](attribute.md#literal-literal-delete-delete-s-n)

    - [`GetAttributes(C): Cat → [ MonStgElt ]`](attribute.md#function-getattributes-cat)

    - [`ListAttributes(C): Cat`](attribute.md#function-listattributes-cat)

- [User-defined Verbose Flags](verbose.md)

  - [`declare verbose F, m;`](verbose.md#literal-literal-declare-verbose-declare-verbose-f-m)

  - [Examples](verbose.md#examples)

    - [`Example: System Attributes`](verbose.md#example-ex-ca5e5c)

    - [`Example: Interactive User Attributes`](verbose.md#example-ex-659b09)

    - [`Example: Package User Attributes`](verbose.md#example-ex-280c05)

- [User-Defined Types](type.md)

  - [Declaring User-Defined Types](type.md#declaring-user-defined-types)

    - [`declare type T;`](type.md#literal-literal-declare-type-declare-type-t)

    - [`declare type T: P₁, ..., Pₙ;`](type.md#literal-literal-declare-type-isa-declare-type-t-p1-pn)

    - [`declare type T[E];`](type.md#literal-literal-declare-type-declare-type-t-e)

    - [`declare type T[E]: P₁, ..., Pₙ;`](type.md#literal-literal-declare-type-isa-declare-type-t-e-p1-pn)

  - [Creating an Object](type.md#creating-an-object)

    - [`New(T): Type → T`](type.md#function-new-type)

    - [`Clone(X): Any → Any`](type.md#function-clone-any)

  - [Special Intrinsics Provided by the User](type.md#special-intrinsics-provided-by-the-user)

  - [Examples](type.md#examples)

    - [`Example: My Rat`](type.md#example-ex-6e336c)

    - [`Example: User Types2`](type.md#example-ex-5c6834)
