# `PtcRunner.Lisp.Keyword`
[🔗](https://github.com/andreasronge/ptc_runner/blob/main/lib/ptc_runner/lisp/keyword.ex#L1)

Runtime representation for PTC-Lisp keywords that are not in the bounded atom vocabulary.

Existing atom-backed keywords remain atoms for compatibility. New source keywords use this
struct so user input cannot grow the BEAM atom table while keywords stay distinct from strings.

# `t`

```elixir
@type t() :: %PtcRunner.Lisp.Keyword{name: String.t()}
```

# `keyword?`

```elixir
@spec keyword?(term()) :: boolean()
```

# `name`

```elixir
@spec name(atom() | t()) :: String.t()
```

# `new`

```elixir
@spec new(String.t()) :: t()
```

# `valid_name?`

```elixir
@spec valid_name?(term()) :: boolean()
```

Whether `name` is a syntactically valid keyword name per the parser grammar.

A novel keyword externalizes to a plain binary, so this is the check
callers use to tell a genuine externalized keyword from an arbitrary
string at a boundary.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
