# Percentage sign \[Characters added to make the required 15 here\]

**URL:** <https://racket.discourse.group/t/percentage-sign-characters-added-to-make-the-required-15-here/4284>\
**Category:** Questions & Answers\
**Created:** [June 16, 2026, 11:36am UTC](https://racket.discourse.group/t/percentage-sign-characters-added-to-make-the-required-15-here/4284 "2026-06-16T11:36:43Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![jsampson45](https://avatars.discourse-cdn.com/v4/letter/j/77aa72/32.png) [@jsampson45](https://racket.discourse.group/u/jsampson45)\
**Post date:** [June 16, 2026, 11:36am UTC](https://racket.discourse.group/t/percentage-sign-characters-added-to-make-the-required-15-here/4284/1 "2026-06-16T11:36:43Z")

</div>

Being very new to Racket, I see in the documentation percentage-sign suffixes "%" or "\<%\>". What do these mean? Are there any documents explaining these?

---

<div class="post-metadata">

**Author:** ![EmEf](https://avatars.discourse-cdn.com/v4/letter/e/53a042/32.png) [@EmEf](https://racket.discourse.group/u/EmEf)\
**Post date:** [June 16, 2026, 11:54am UTC](https://racket.discourse.group/t/percentage-sign-characters-added-to-make-the-required-15-here/4284/2 "2026-06-16T11:54:14Z")

</div>

Racket’s grammar of identifiers is far more generous than that of a pederstian language. So % @ #! & \* and such things can be, and often are, part of ordinary identifiers.

Racket’s style comes with a number of (unenforced) conventions. So the ending of `%` in `my-class%` says “I am the name of a class.” Similarly. `<%>` signals I am the name of an interface.

---

<div class="post-metadata">

**Author:** ![soegaard](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/soegaard/32/19_2.png) [@soegaard](https://racket.discourse.group/u/soegaard)\
**Post date:** [June 16, 2026, 1:11pm UTC](https://racket.discourse.group/t/percentage-sign-characters-added-to-make-the-required-15-here/4284/3 "2026-06-16T13:11:58Z")

</div>

I asked ChatGPT for a table over similar conventions.  
Looks correct to me.

| Convention | Usually means | Example | Notes |
| --- | --- | --- | --- |
| `?` suffix | predicate / boolean-valued function | `empty?`, `boolean?` | A question-like name answers yes/no. ([Racket Documentation](https://docs.racket-lang.org/style/Textual_Matters.html "6 Textual Matters")) |
| `!` suffix | mutation / setter / destructive update | `set!`, `set-box!`, `vector-set!` | The “bang” convention is inherited from Scheme/Lisp style. ([Racket Documentation](https://docs.racket-lang.org/style/Textual_Matters.html "6 Textual Matters")) |
| `%` suffix | class | `object%`, `game-state%` | The convention discussed in the Discourse thread. ([Racket Discourse](https://racket.discourse.group/t/percentage-sign-characters-added-to-make-the-required-15-here/4284 "Percentage sign [Characters added to make the required 15 here] - Questions & Answers - Racket Discourse")) |
| `<%>` suffix | interface | `dc<%>`, `area<%>` | Visually suggests an interface-ish “shape.” ([Racket Discourse](https://racket.discourse.group/t/percentage-sign-characters-added-to-make-the-required-15-here/4284 "Percentage sign [Characters added to make the required 15 here] - Questions & Answers - Racket Discourse")) |
| `^` suffix | unit signature | `game-context^` | Used with Racket’s unit system. ([Racket Documentation](https://docs.racket-lang.org/style/Textual_Matters.html "6 Textual Matters")) |
| `@` suffix | unit | `testing-context@` | Pairs naturally with `^` signatures. ([Racket Documentation](https://docs.racket-lang.org/style/Textual_Matters.html "6 Textual Matters")) |
| `#%` prefix | kernel / language-building identifier | `#%app`, `#%module-begin` | Signals “extremely special” identifiers, often relevant when defining languages. ([Racket Documentation](https://docs.racket-lang.org/style/Textual_Matters.html "6 Textual Matters")) |
| `/` inside name | “with”, specialization, or variant | `call/cc`, `foldl/steps` | The style guide glosses `/` as a preposition like “with.” ([Racket Documentation](https://docs.racket-lang.org/style/Textual_Matters.html "6 Textual Matters")) |
| `-` between words | normal word separator | `render-game-state` | Preferred over camelCase or underscores in Racket style. ([Racket Documentation](https://docs.racket-lang.org/style/Textual_Matters.html "6 Textual Matters")) |
| data-type prefix | operation on a main data type | `board-free-spaces`, `syntax-local-value` | Common for functions in an ADT/module; resembles struct selector names. ([Racket Documentation](https://docs.racket-lang.org/style/Textual_Matters.html "6 Textual Matters")) |
| type-ish suffix on local variables | variable’s representation/type | `name-string`, `name-symbol` | Especially useful when the same data appears in multiple guises. ([Racket Documentation](https://docs.racket-lang.org/style/Textual_Matters.html "6 Textual Matters")) |
| `_` as placeholder | ignored value / wildcard | `_` in `match` or syntax patterns | The style guide discourages underscores in ordinary names, but accepts `_` as a placeholder. ([Racket Documentation](https://docs.racket-lang.org/style/Textual_Matters.html "6 Textual Matters")) |

It added this table:

| Convention | Usually means | Example | Notes |
| --- | --- | --- | --- |
| `->` inside name | conversion | `string->symbol`, `number->string` | Read aloud as “to.” |
| `*` suffix or infix | variant / generalized form | `let*`, `for*`, `regexp-match*` | Often means sequential, repeated, or “all matches,” depending on context. |
| `:` inside name | hierarchy / refinement | `exn:fail:contract` | Common in exception and struct-type names. |
| `...` in syntax patterns | repetition | `(x ...)` | This one is syntactic, not merely a naming convention. |

Source: [https://chatgpt.com/share/6a314b0f-1d84-83e8-ae24-2eb7f2bdb915](https://chatgpt.com/share/6a314b0f-1d84-83e8-ae24-2eb7f2bdb915)

---

<div class="post-metadata">

**Author:** ![EmEf](https://avatars.discourse-cdn.com/v4/letter/e/53a042/32.png) [@EmEf](https://racket.discourse.group/u/EmEf)\
**Post date:** [June 16, 2026, 1:47pm UTC](https://racket.discourse.group/t/percentage-sign-characters-added-to-make-the-required-15-here/4284/4 "2026-06-16T13:47:55Z")

</div>

I use `1security*` to indicate that the variable stands for a possibly empty list of `1security` -s. Similarly, `1security+` denotes a non-empty one. Thanks Kleene.

(Yes, a good sw dev would distinguish the two via a char at the beginning of the identifier, but I tried `*1security` and it doesn’t feel Kleene-ish.)

---

<div class="post-metadata">

**Author:** ![benknoble](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/benknoble/32/16_2.png) [@benknoble](https://racket.discourse.group/u/benknoble)\
**Post date:** [June 16, 2026, 2:24pm UTC](https://racket.discourse.group/t/percentage-sign-characters-added-to-make-the-required-15-here/4284/5 "2026-06-16T14:24:02Z")

</div>

The [style guide](https://docs.racket-lang.org/style/Textual_Matters.html#%28part._names%29)  
describes these suffixes, but note MF's point that these are stylistic  
and not enforced by the language. `%@#!&*` is a valid identifier 🙂

---

<div class="post-metadata">

**Author:** ![greghendershott](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/greghendershott/32/98_2.png) [@greghendershott](https://racket.discourse.group/u/greghendershott)\
**Post date:** [June 21, 2026, 9:05pm UTC](https://racket.discourse.group/t/percentage-sign-characters-added-to-make-the-required-15-here/4284/6 "2026-06-21T21:05:10Z")

</div>

I don't hate infix.

I dislike infix brevity absolutism demanding to write `1+1` -- instead of `1 + 1` -- resulting in all those characters being "reserved" as "operators".

Naming things is hard enough without giving me a character palette that's fifty shades of beige.

---

<div class="post-metadata">

**Author:** ![soegaard](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/soegaard/32/19_2.png) [@soegaard](https://racket.discourse.group/u/soegaard)\
**Post date:** [June 22, 2026, 11:05am UTC](https://racket.discourse.group/t/percentage-sign-characters-added-to-make-the-required-15-here/4284/7 "2026-06-22T11:05:15Z")

</div>

Precedence tables can be overwhelming.

This illustrates the problem nicely:

> **[Operator Input Forms—Wolfram Documentation](https://reference.wolfram.com/language/tutorial/OperatorInputForms.html)**
>
> Characters that are not letters, letter-like forms, or structural elements are treated by the Wolfram Language as operators. The Wolfram Language has built-in rules for interpreting all operators. The functions to which these operators correspond may...

---

<div class="post-metadata">

**Author:** ![gus-massa](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/gus-massa/32/507_2.png) [@gus-massa](https://racket.discourse.group/u/gus-massa)\
**Post date:** [June 22, 2026, 3:47pm UTC](https://racket.discourse.group/t/percentage-sign-characters-added-to-make-the-required-15-here/4284/8 "2026-06-22T15:47:11Z")

</div>

> An expression like `x!y` could potentially mean either `(x!)*y` or `x*(!y)`. The first interpretation is chosen because [Factorial](https://reference.wolfram.com/language/ref/Factorial.html) has higher precedence than [Not](https://reference.wolfram.com/language/ref/Not.html).
