---
name: "hoc"
section: "1plan9"
platform: "linux"
package: "9base"
version: "1:6-14"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/hoc"
---

# hoc(1plan9)

interactive floating point language

## NAME

hoc - interactive floating point language

## SYNOPSIS

**hoc** \[ *file ...* \] \[ **-e** *expression* \]

## DESCRIPTION

*Hoc* interprets a simple language for floating point arithmetic, at about the level of BASIC, with C-like syntax and functions.

The named *files* are read and interpreted in order. If no *file* is given or if *file* is *hoc* interprets the standard input. The **-e** option allows input to *hoc* to be specified on the command line, to be treated as if it appeared in a file.

*Hoc* input consists of *expressions* and *statements*. Expressions are evaluated and their results printed. Statements, typically assignments and function or procedure definitions, produce no output unless they explicitly call *print*.

Variable names have the usual syntax, including  the name  by itself contains the value of the last expression evaluated. The variables **E**, **PI**, **PHI**, **GAMMA** and **DEG** are predefined; the last is 59.25..., degrees per radian.

Expressions are formed with these C-like operators, listed by decreasing precedence.

- **^**

  exponentiation

- **! - ++ --**

  - **\* / %**

  - **+ -**

  - **\> \>= \< \<= == !=**

  - **&&**

  - **\|\|**

  - **= += -= \*= /= %=**

  Built in functions are **abs**, **acos**, **asin**, **atan** (one argument), **cos**, **cosh**, **exp**, **int**, **log**, **log10**, **sin**, **sinh**, **sqrt**, **tan**, and **tanh**. The function **read(x)** reads a value into the variable **x** and returns 0 at EOF; the statement **print** prints a list of expressions that may include string constants such as "hello\\n".

Control flow statements are **if**-**else**, **while**, and **for**, with braces for grouping. Newline ends a statement. Backslash-newline is equivalent to a space.

Functions and procedures are introduced by the words **func** and **proc**; **return** is used to return with a value from a function.

## EXAMPLES

```
func gcd(a, b) {
	temp = abs(a) % abs(b)
	if(temp == 0) return abs(b)
	return gcd(b, temp)
}
for(i=1; i<12; i++) print gcd(i,12)
```

## SOURCE

**/src/cmd/hoc**

## SEE ALSO

[*bc*(1)](/bc/1.md), [*dc*(1)](/dc/1.md)\
 B. W. Kernighan and R. Pike, *The Unix Programming Environment,* Prentice-Hall, 1984

## BUGS

Error recovery is imperfect within function and procedure definitions.
