From b0f0f0c72381d2db21fb8408711b18fe2016a26d Mon Sep 17 00:00:00 2001 From: Thomas Walker Lynch Date: Mon, 22 Jun 2026 08:44:44 +0000 Subject: [PATCH] moved code format to RT-style --- developer.tar | Bin 92160 -> 0 bytes developer/document/RT-code-format-Lisp.html | 398 -------------------- developer/document/RT-code-format.html | 287 -------------- setup | 4 +- shared/linked-project/RT-style-JS_public | 1 - shared/tool/setup | 35 -- 6 files changed, 3 insertions(+), 722 deletions(-) delete mode 100644 developer.tar delete mode 100644 developer/document/RT-code-format-Lisp.html delete mode 100644 developer/document/RT-code-format.html delete mode 120000 shared/linked-project/RT-style-JS_public diff --git a/developer.tar b/developer.tar deleted file mode 100644 index b64d49e71dc400de687dc83665a8eb2eaf331f78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92160 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 Za1DWL2wX$p8Uoi4xQ4(r1QtTz{{uu$&Uyd< diff --git a/developer/document/RT-code-format-Lisp.html b/developer/document/RT-code-format-Lisp.html deleted file mode 100644 index 888e5fe..0000000 --- a/developer/document/RT-code-format-Lisp.html +++ /dev/null @@ -1,398 +0,0 @@ - - - - - RT Code Format: Lisp Addendum - - - - - - - - - - -

- This document serves as the authoritative addendum for applying the RT code format conventions to Lisp dialects, specifically Emacs Lisp. It integrates micro-syntax rules with macro-structural organization to ensure consistency across the software ecosystem. -

- -

File Architecture and Section Banners

-

- To maintain a predictable progression from static data to external hooks, a Lisp file is divided into standard architectural sections. Each section is introduced by an Architectural Banner. -

- -
    -
  • Utilities:General use helpers that are independent of the code in the module. Perhaps these will later be moved to a utilities library.
  • -
  • Configuration: Houses foundational parameters, constants (defconst), and global variables that dictate module behavior.
  • -
  • Interior code: Reserved for internal, non-exported mechanisms. This includes private helper functions, macros, and localized state variables that support the public interface but remain isolated from external dependencies.
  • -
  • API: The public boundary of the module. It contains the primary functions with stable signatures and clear contracts intended for consumption by other parts of the system.
  • -
  • Interactive: Isolates functions designed for direct human execution through the Emacs command loop, typically utilizing the (interactive) declaration.
  • -
  • Integration: Placed at the bottom of the file, this section handles side effects that wire the module into the broader environment, such as adding hooks, defining keybindings, or applying advice. It is permitted to reference the API and Interactive sections, but must never reference Interior code.
  • -
- -

Comment Ontology

-

- The commenting style in Lisp is highly structured, using semicolon counts and indentation to create a clear visual hierarchy. A programmer should assume the reader can understand Lisp syntax; avoid comments that merely translate the code below them into English prose. -

- -
    -
  • The Prologue Block: Located at the very top of the document. It uses flush left triple semicolons ;;;. Empty triple semicolons act as vertical spacing to separate paragraphs without breaking the block format.
  • - -
  • The Architectural Banner: Used for major file divisions (like Configuration, API). It consists of flush left triple semicolons followed by a continuous line of dashes, a title line, and an empty triple semicolon line.
  • - -
  • The Scope Header: Used to group related variables or functions within a major section. These are indented two spaces, begin with double semicolons ;;, and are followed by an empty double semicolon line for vertical padding.
  • - -
  • The Contract Annotation: Double semicolon comments indented two spaces, placed directly above a function definition. They specify preconditions, structural expectations, or size checks that must be true before the function is called.
  • - -
  • The Trailing Tag: A single semicolon ; placed at the end of a line of executable code, used to label a specific return state or note a brief detail.
  • -
- -

Header case, for all RT documents and code, is an initial capital letter, and no trailing period. Acronyms and tagged code or terms keep their original capitalization or lack thereof.

- -

Identifier Naming and Namespaces

- -

Primary and Secondary Separators

-

- Because Emacs Lisp and Common Lisp support the hyphen character in identifiers, Lisp code utilizes snake-kebab_case. The hyphen acts as the primary word separator. The underscore is reserved strictly as a secondary separator to group logically related portions of an identifier or to denote semantic boundaries, acting as a structural namespace within the symbol (e.g., city-scape_building-height). -

- -

Ad Hoc Namespaces

-

- Emacs Lisp shares a global environment. To prevent global environment pollution, functions and global variables use the center dot (·) to separate namespace hierarchies. Spaces are omitted around the dot to ensure the symbol evaluates contiguously. -

- - (defconst RT·first-order-list·control·continue 0) - - -

Code Structure Attributes

-

- The code structure heavily applies the RT Code Format conventions to a Lisp environment, resulting in a distinct visual footprint. -

- -

Global Two Space Offset

-

- Unlike standard Emacs Lisp where top level forms like defun or setq are flush left, the entire programmatic contents of the file are indented by two spaces. -

- -

Function Call Enclosures

-

- Lisp function calls are exempt from the multi-level enclosure padding rule. The outer parentheses forming a function call receive no padding, even when they contain nested data lists. -

- - (cat 'a 'b '( 2 (4 5))) - - -

Vertical Branching

-

- The if and while statements are expanded vertically. The operator, the condition, the true branch, and the false branch each occupy their own isolated lines. -

- -

Isolated Binding Blocks

-

- In let and let* forms, the variable declaration list is pushed to its own level. The opening parenthesis sits alone on a new line. Each binding sits on its own line. The closing parenthesis sits alone, vertically aligned with the opening parenthesis. The body of the form follows on the subsequent line. -

- -

Using let to destructure a list

-

- Don't destructure a list and then use the parts in a single `let*`, instead destructure the list in a first list, then use the parts in a second nested `let`. -

- -

Cascading Closures

-

- When the items of a list appear one per line, i.e. for a vertical list, the closing parenthesis, and all cascading closures, appear on a line of their own at the same indention level as though an element of the list. In a sense, the innermost vertical list wins, as it will close all the vertical lists it is nested in. -

- - (let - ( - (example_list - (list - '(4 [0]) - '(5 [1]) - '(6 []) - ))) - ... - - - -

A comment subsection

-

- When a comment under a triple semicolon section forms a subsection, the - comment starts at the indention level of the code, has two semicolons. After the comment there is a line at the indent level with only two semicolons. Then there is a blank line. The subsection contents follow. -

- - ;; Color logic - ;; - - (defun RT-literal·highlight-none () - nil - ) - - (defun RT-literal·highlight-default () - 'region - ) - - -

one line specific comment

-

- A single semicolon occurs after the code on the line, followed by a comment. -

- - - - - -

Contiguous Form Cluster

-

- When the comment adds insight into the code, the comment typically appears with two semicolons at the same indentation level above said code. There is no following blank line. All code the comment applies to then follows without intervening blank lines. -

- - ;; By contract: only called when overlay is in quoted form, and null string case already handled - ;; Everything from content_leftmost to content_rightmost is data, inclusive. - (setq RT-literal·describe-new-form_status (list 'new-good)) - (defun RT-literal·describe-new-form_message (status) - nil - ) - (defun RT-literal·describe-new-form (overlay_leftmost content_rightmost_right-neighbor) - (let* - ( ... ) - ... - ))) - - -

API Design Conventions

- -

Parameter Ordering

-

- When defining function signatures, static configuration parameters (such as sizes, limits, or modes) must precede data payloads or instances that are actively manipulated. This facilitates partial application and logical readability. -

- -

TTCA Theory Terminology

-

- The following definitions bridge the gap between abstract TTCA theory and practical implementation conventions. -

- -
    -
  • Tape: An array of cells. A tape has a leftmost cell and a rightmost cell.
  • -
  • Rightmost Right-Neighbor: The cell located one position to the right of the rightmost cell. A tape area is not guaranteed to have a rightmost_right-neighbor, but it will always have a rightmost cell.
  • -
  • Extent: The index of the rightmost cell. The index of the leftmost cell is conventionally 0. The extent defines the required bit size of an index register. When speaking of arrays of bytes, extent is the maximum byte index.
  • -
  • Length: A count of cells in an array. Length is 1 plus extent, and can overflow an index register.
  • -
  • Size: A count of the underlying bytes, unless otherwise noted.
  • -
  • Position: An index (similar to a cursor position) that indicates a cell. Emacs positions differ mathematically from TTCA theory indexes.
  • -
- -

- The TTCA ontology is a topological description. It speaks of left, and right, of leftmost and rightmost. Time dependent terms such as first or last imply scanning/traversal. The first cell scanned could be anywhere on the tape, depending on the algorithm used for the scan or traversal. Careful, the term rightmost refers to a cell that is included on the tape. It is an inclusive bound. Today exclusive bounds are more common. Inclusive found loops often exit from the middle. -

- - -

The First/Rest Loop Technique

- -

The first/rest loop is an iterative control flow pattern designed for sequence traversal and state machine evaluation. The pattern explicitly separates the evaluation of the initial state (the "first") from the continuous cycle of advancing and re-evaluating (the "rest").

- -

This technique eliminates the need for mid-loop escape clauses, such as break or throw/catch, and avoids evaluating out-of-bounds memory by ensuring the tape head is always validated before stepping.

- -

The Structural Form

- -

The structure requires performing the initial work on the first valid cell and evaluating the boundary condition simultaneously. Because a freshly cued tape machine always rests on valid data, the first cell is processed immediately within the initial variable bindings. The loop condition then evaluates both the result of that work and whether the machine has a right neighbor. Inside the loop, the machine steps, and both the work and boundary conditions are explicitly re-evaluated and updated at the absolute bottom.

- -

If the work performed on the cell is extensive, a programmer should extract that logic into a helper function. This helper function is called once in the initial bindings for the "first" phase, and once inside the loop for the "rest" phase.

- -

Here is the canonical RT code format for the first/rest loop:

- - - (let - ( - ;; 1. The "First" Work & Boundary Evaluation - (work-successful (evaluate-current-cell machine)) - (has_right-neighbor (RT·TM·has-right-neighbor machine)) - ) - ;; 2. The rest loop - (while (and work-successful has_right-neighbor) - (progn - ;; 3. The "Step" phase - (RT·TM·step machine) - - ;; 4. The "Rest" Work & Boundary Evaluation - (setq work-successful (evaluate-current-cell machine)) - (setq has_right-neighbor (RT·TM·has-right-neighbor machine)) - )) - ;; Return the final state of the work - work-successful - ) - - -

- Elisp does not have a middle-of-loop exit, but if it did, the logic would look like this: -

- - - (let - ( - (work-successful nil) - (has_right-neighbor nil) - ) - (loop - (setq work-successful (evaluate-current-cell machine)) - (setq has_right-neighbor (RT·TM·has-right-neighbor machine)) - - (if - (not (and work-successful has_right-neighbor)) - (break) - (RT·TM·step machine) - )) - work-successful - ) - - -

Which eliminates the need for two calls to evaluate-current-cell and has-right-neighbor. This can be done in other languages that have a loop break. (Donald Knuth argued in his 1974 paper, Structured Programming with go to Statements, that forcing programmers to duplicate code simply to satisfy a rigid while or repeat/until pre/post-test constraint was a failure of the language's expressiveness. Also discussed in the Art of Computer Programming.) -

- -

If we are willing to us catch and throw in normal control flow, this can be done in elisp as: -

- - - (catch 'loop-exit - (while t - (let - ( - (work-successful (evaluate-current-cell machine)) - (has_right-neighbor (RT·TM·has-right-neighbor machine)) - ) - (if - (not (and work-successful has_right-neighbor)) - (throw 'loop-exit work-successful) - (RT·TM·step machine) - )))) - - -

So defining:

- - (defmacro RT·loop (&rest body) - "An infinite loop construct designed to be exited via RT·break." - `(catch 'loop-exit - (while t - ,@body - ))) - - (defmacro RT·break (&optional return_val) - "Break out of an RT·loop, optionally returning RETURN_VAL." - `(throw 'loop-exit ,return_val) - ) - - -

Our example becomes:

- - - (let - ( - (work-successful nil) - (has_right-neighbor nil) - ) - (RT·loop - ;; 1. The Work & Boundary Evaluation - (setq work-successful (evaluate-current-cell machine)) - (setq has_right-neighbor (RT·TM·has-right-neighbor machine)) - - ;; 2. The Mid-Loop Condition Check - (if - (not (and work-successful has_right-neighbor)) - (RT·break work-successful) - ;; 3. The "Step" phase - (RT·TM·step machine) - )) - ) - - -

- Production code first/rest loop example without a middle loop break. -

- - - (defun RT·TM·sequence·eq (TM_substrate TM_target) - (let - ( - (TM-substrate-copy (RT·TM·entangled-copy TM_substrate)) - (TM-target-copy (RT·TM·entangled-copy TM_target)) - ) - (let - ( - (are-eq (= (RT·TM·read TM-substrate-copy) (RT·TM·read TM-target-copy))) - (target-has-right-neighbor (RT·TM·has-right-neighbor TM-target-copy)) - (substrate-has-right-neighbor (RT·TM·has-right-neighbor TM-substrate-copy)) - ) - (while - (and are-eq target-has-right-neighbor substrate-has-right-neighbor) - (progn - (RT·TM·step TM-substrate-copy) - (RT·TM·step TM-target-copy) - (setq are-eq (= (RT·TM·read TM-substrate-copy) (RT·TM·read TM-target-copy))) - (setq target-has-right-neighbor (RT·TM·has-right-neighbor TM-target-copy)) - (setq substrate-has-right-neighbor (RT·TM·has-right-neighbor TM-substrate-copy)) - )) - (and are-eq (not target-has-right-neighbor)) - ))) - - -

If the double call code is substantial, and we do not want to use a middle break, it can be put in a helper function, and then this reduces to two calls to the helper. the helper function is called in the first part and the rest loop. If the programmer tries to trick the loop by giving the variables fake values in the first part, the first/rest pattern will be broken. -

- -

Relationship between first/rest and Tail Recursion

- -

The first/rest loop is the exact iterative equivalent of a tail-recursive function.

- -

In a functional paradigm, a sequence is algebraically defined as a head (first) and a tail (rest). A tail-recursive function evaluates the head, performs the necessary work, and then returns the result of calling itself on the tail.

- -

Environments lacking Tail Call Optimization (TCO), such as Emacs Lisp, will throw a stack overflow error if a recursive function traverses a long sequence. The first/rest loop flattens this recursive mathematical model into memory-safe iteration by mapping the recursive phases directly to iterative steps:

- -

The Initial Function Call: The initial work and the let block bindings in the first/rest loop mirror the initial execution and argument evaluation of the recursive function.

- -

The Base Case Check: The while loop condition mirrors the recursive base case. If the condition fails, the loop terminates, mimicking the recursive function returning its final value.

- -

The Tail Call: The step and setq updates at the bottom of the loop body mirror the argument passing of the tail-recursive call. Updating the variables and allowing the while loop to jump back to the top is functionally identical to the function invoking itself with a new set of parameters for the "rest" of the sequence.

- -

By adhering to this pattern, a programmer retains the strict, predictable state management of functional recursion while satisfying the physical memory constraints of an iterative runtime environment.

- -

To illustrate the mathematical equivalence, here is the exact same logic written as a tail-recursive function. Note that while this form is theoretically pure, the first/rest iterative loop is strictly preferred in Emacs Lisp. Because Elisp lacks Tail Call Optimization (TCO), this recursive form would eventually exhaust the call stack and crash when traversing massive sequences.

- - - (defun process-sequence-recursively (machine) - (let - ( - ;; 1. The "First" Work & Boundary Evaluation - (work-successful (evaluate-current-cell machine)) - (active (RT·TM·has-right-neighbor machine)) - ) - ;; 2. The Condition check - (if (and work-successful active) - (progn - ;; 3. The "Step" phase - (RT·TM·step machine) - - ;; 4. The Tail Call (The "Rest") - ;; This directly replaces the setq updates and loop jump - (process-sequence-recursively machine) - ) - ;; Base case: loop terminates, return final state - work-successful - ))) - - -

Exercise

-

Show the 'production code' with a first/rest pattern using the RT macros and a middle break loop.

- -
- - diff --git a/developer/document/RT-code-format.html b/developer/document/RT-code-format.html deleted file mode 100644 index e4924fa..0000000 --- a/developer/document/RT-code-format.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - RT code format conventions - - - - - - - - - - -

- This document has been evolving. Consequently there is a body of non-conforming code. Whenever we run up against it, it is nice to update it. -

- -

Object vs. instance nomenclature

-

- It is too much of an ask to remove the word 'object' from the English language, and then set it aside and give it a esoteric technical meaning. This is why the term is often misused. So we instead talk about an interface as being a set of functions that share one or more state variables. The term instance is then a collection of such state variables and their values sitting in memory. Interface functions are usually grouped within a named container, and state variables are often grouped into a single named data structure. -

-

- In some languages the instance occurs to the left of a lower dot (period) operator and is referred to as this from inside the interface functions. In other languages there is a convention where the instance is passed in as the first parameter to interface functions. There can also be interface functions that accept multiple instances of the same type. Bridge interfaces can be created that accept two instances potentially of different types. -

-

- Since we have released object from captivity, a programmer can talk about math objects, as things found in mathematics, and C objects, as things found in the C language, even though they are not instantiated from classes, or might not even be data. For example, the for loop is a C object. -

- -

Identifier names

- -

Case

-
    -
  • Types, modules: PascalCase
  • -
  • Functions, variables: snake-kebab_case. If a language does not allow the - character in identifiers, then snake-kebab_case reduces to RT-code>snake_case.
  • -
  • Globals: UPPER_SNAKE-KEBAB_CASE, that, reduces to UPPER_SNAKE_CASE when the language does not allow the - character in identifiers.
  • -
- -

Proper nouns and acronyms

-

- Even in PascalCase and snake-kebab_case, proper nouns and acronyms remain capitalized, as per standard English language conventions (e.g., IEEE_publication-count). -

- -

Abbreviations

-

- For outer scope identifiers we spell things out for clarity. This follows Lisp programming culture. This makes it clear for people who are 'not in the club' to be able to get started and read the code, and tends to be self documenting. Our file system names mirror our program identifier rules, so you find things such as 'library', 'source', spelled out. -

-

- For long words, inner scope identifiers, temporary variables, and conventional suffixes, abbreviations become more common. By the time we get to inner loops variable names, such as loop counters are typically 1 letter long. -

- -

Primary and secondary separator use

-

- When a language supports the dash, -, dash connected components are given precedence and of choice, and bind semantically higher than under score separated components. E.g. rounded_x-coordinate. -

-

- Otherwise, if the language does not support hyphens in identifiers (such as C, Python, and Java), we conventionally drop the nicety of multiple semantic bindings, e.g. rounded_x_coordinate. However if the distinction has high value, a double underscore and be used, rounded__x_coordinate. -

- -

Ad hoc namespacing

-

- Most parsers now a allow a center dot (·) in identifiers. In languages were namespaces are not explicitly available, we use the cdot to represent a namespace. Namespaces are closely related to module names, class names, interface names, and to type names,so all are written in PascalCase. So for example, Math·rounded__x_coordinate, might be variable in the Math namespace, a function on the Math interface, etc. - -

Component order

-

- As long as it is sensible, and doesn't break parallel constructions, place the least changing component, or the broadest category, to the left of the identifer. For example, a conditional write functions would be called, `write-conditional`, not `conditional-write` because it is a refinement on the general category or write functions. -

- -

Copy,read, write

-

- 'read' and 'write', are the two ends of a copy. When 'this instance' is understood as being one end of the copy, then using 'read' or 'write' makes sense. However, it is generally better to provide an external copy command. The order of arguments in a copy command are `read from source value --> write to destination value` i.e. data flows from left to write. (This is contrary to an assignment operator, which has data flowing from right to left during a copy.) -

- -

The term make

-

- When allowed by the langauge, factory functions are called 'make'. They are not called 'create', nor 'new'. -

- -

Function terminology

-

- Parameters are what give a function its characteristics. They are typically static. They are one step away from values that are curried into a function. Parameter variables are given with the function definition, and parameter values are given to the function at run time when it is called. -

-

- Given argument values can be said to be bound to arguments variables upon call. -

-

- Arguments drive the function computation. Conceptually they might change on every separate call, so they are highly dynamic. Argument variables are specified when the function is defined. Argument values are given to the function at call time. -

-

- Values are said to be given to a function. We don't say a function takes arguments, as though a call stack could reach into memory and grab values. We use terms accept and reject of values for guard code. For a function to accept an argument value is to mean that argument value was tested and passed. As an example, we can say that a square root function only accepts values greater than or equal to zero, or that it rejects negative values. -

-

- Operators are logically functions by another name. Syntactically infix notation is often used. Operands are arguments given to an operator. -

- -

Plural identifiers

- -

- Do not make the names of containers plural, instead prefix the container abstract type, or actual type before the identifier. Recall that types are PascalCase. -

- -
    -
  • list_* / seq_* : generic ordered items / indexed items
  • -
  • Map_* / dict_* : keyed containers
  • -
- -

Add a type prefix when it adds clarity.

-
    -
  • count-of_* : number of elements
  • -
  • Bool_* : Bool type
  • -
  • flag_* : value used as a Boolean flag
  • -
- -

Identifiers for directory/file names

-
    -
  • dir_* : directory name
  • -
  • dirn_* : directory name
  • -
  • dirp_* : directory path
  • -
  • dirpr_* / dirpa_* : relative / absolute directory path
  • -
  • file_* : file name
  • -
  • filen_* : file name
  • -
  • filep_* : file path
  • -
  • filepr_* / fpr_* : relative path
  • -
  • filepa_* / fpa_* : absolute path
  • -
  • fsnodn_* : file system node name -
  • fsnodp_* : file system node path -
  • fsnodpr_* / fsnpr_* : relative
  • -
  • fsnodpa_* / fsnpa_*: absolute
  • -
- -

Comma separated lists

- -

Horizontal comma list

-

The comma is preceded by a space and abuts the item it follows.

- - int x ,y ,z; - - -

Vertical comma list

-

The comma is placed before the item on the new line, aligned with the item's indentation. This applies to all languages, including Python and C.

- - result = some_function( - first_argument - ,second_argument - ,third_argument - ); - - -

Enclosure spacing

- -

Single-level enclosures

-

No space padding inside the enclosure punctuation.

- - if(condition){ - do_something(); - } - - -

Multi-level enclosures

-

One space of padding is applied only to the outermost enclosure punctuation.

- - - if( f(g(x)) ){ - do_something(); - } - - -

This rule is not applied to function calls in Lisp. For example, the outer parentheses forming a function call receive no padding, even when they contain nested data lists:

- - - (cat 'a 'b '( 2 (4 5))) - - -

Indentation

-
    -
  • Strictly two spaces per indentation level.
  • -
  • Never use tabs.
  • -
  • Nest lines under the syntactic element that opened them.
  • -
-

Python enforces indentation syntactically. Use two-space indentation for all Python code, even though four is common in the wider ecosystem.

- -

The CLI vs. work function pattern

-

- To avoid the "String Trap" (where logic is tightly coupled to the terminal and requires string serialization to reuse) executable modules must separate the Command Line Interface from the core logic. -

-
    -
  • Work Functions: Implement core logic. They accept and return native instances (ints, lists, paths), never look at sys.argv (or equivalent), and do not depend on being run from a command line.
  • -
  • CLI Function: The bridge between the OS and the Work Function. It is always named CLI(). It parses string arguments into native types, calls the Work Function, formats the output for the user, and translates exceptions into exit codes.
  • -
- -

Python application

-

Put argument parsing and if __name__ == "__main__": in the CLI section. Keep side effects out of import time.

- -

Bash application

-

Bash scripts should start with #!/usr/bin/env bash and set -euo pipefail. RT-style Bash separates a small top-level CLI harness from a set of functions that implement the work. Parse arguments into variables, call a main function with explicit parameters, and avoid relying on global mutable state where possible.

- -

C addendum: error handling and ownership

-
    -
  • Functions should document ownership of pointers and lifetimes.
  • -
  • Prefer explicit *_count parameters over sentinel values when passing arrays.
  • -
- -

Automated formatting tools

-

- To ensure consistency without manual drudgery, the Harmony skeleton provides a dedicated code formatter called RTfmt. A person can find this tool in the shared/tool/ directory. -

- -

The RTfmt CLI

-

- RTfmt is a shallow-tokenizing formatter written in Python. It parses source code into structural blocks (strings, comments, commas, and enclosures) without needing a full Abstract Syntax Tree. This architecture allows it to safely enforce RT formatting rules across multiple languages while preserving indentation and protecting native operators. -

-
    -
  • RTfmt write <file...> : Formats files in place. It performs a content comparison before writing, leaving the file modification timestamp untouched if the file is already compliant.
  • -
  • RT-formatter pipe : Reads from standard input and writes to standard output, making it ideal for editor integration.
  • -
  • --lisp : A flag that instructs the formatter to skip the outermost enclosure padding rule, honoring the Lisp function call exception.
  • -
- -

Emacs integration

-

- For Emacs users, the RT-formatter.el file provides the RT-formatter-buffer interactive command. -

-

- This wrapper passes the current buffer through the RT-formatter pipe command. It automatically detects Lisp-derived modes to append the --lisp flag. Furthermore, it utilizes a non-destructive buffer replacement strategy. This ensures that a programmer's cursor position, selection marks, and window scroll state remain anchored exactly where they were before the formatting occurred. -

- -

Exercises

-

Exercise 1: Comma and function call formatting

-

Reformat the following C code snippet to strictly adhere to the RT code format rules.

- - void my_function(int a, int b, int c) { - int result = calculate_value(a, b, c); - printf("Result: %d, a: %d, b: %d, c: %d\n", result, a, b, c); - } - - -

Exercise 2: Multi-level enclosure and short stuff rule

-

Reformat the following C code snippet to use the multi-level enclosure rule and the short stuff rule.

- - if (check_permissions(user_id, file_path) && is_valid(file_path)) { - for (int i = 0; i < 10; i++) { - if (i % 2 == 0) { - printf("Even: %d\n", i); - } - } - } - - -

Exercise 3: Identifier Naming Conventions

-

- Rename the following poorly named variables to strictly adhere to the RT code format rules. Assume these are variables in a C or Python program (using standard snake_case). Pay close attention to proper nouns, acronyms, and the expanded suffix semantics. -

-
    -
  • A variable holding a list of addresses for HTTP servers: httpServers
  • -
  • A variable counting the total number of parsed HTML nodes: num_html_nodes
  • -
  • A custom type representing a JSON payload: json_payload
  • -
  • A boolean indicating if the NASA data download is complete: isNasaDone
  • -
  • A variable holding multiple absolute file paths for images: imageFiles
  • -
- -

Exercise 4: Identifier naming with hyphens

-

- Rename the same poorly named variables from Exercise 3, but this time assume they are written in a language that supports the hyphen (-) in identifiers. Apply the rules for primary and secondary separators, keeping in mind the structural boundary of suffixes. -

-
    -
  • A variable holding a list of addresses for HTTP servers: httpServers
  • -
  • A variable counting the total number of parsed HTML nodes: num_html_nodes
  • -
  • A custom type representing a JSON payload: json_payload
  • -
  • A boolean indicating if the NASA data download is complete: isNasaDone
  • -
  • A variable holding multiple absolute file paths for images: imageFiles
  • -
- -
- - diff --git a/setup b/setup index 7603f3e..a249e2e 100644 --- a/setup +++ b/setup @@ -44,8 +44,10 @@ fi # setup the role # export ROLE="${1}" + export ROLE_HOME="$REPO_HOME/$ROLE" + echo ROLE_HOME "$ROLE_HOME" - tool="${REPO_HOME}/${ROLE}/tool" + tool="${ROLE_HOME}/tool" if [[ ":${PATH}:" != *":${tool}:"* ]]; then export PATH="${tool}:${PATH}" fi diff --git a/shared/linked-project/RT-style-JS_public b/shared/linked-project/RT-style-JS_public deleted file mode 120000 index 9600bc6..0000000 --- a/shared/linked-project/RT-style-JS_public +++ /dev/null @@ -1 +0,0 @@ -../../../RT-style-JS_public/ \ No newline at end of file diff --git a/shared/tool/setup b/shared/tool/setup index 6cfc738..76983e7 100644 --- a/shared/tool/setup +++ b/shared/tool/setup @@ -77,41 +77,6 @@ umask 0077 export PATH -#-------------------------------------------------------------------------------- -# used by release scripts -# - install_file() { - if [ "$#" -lt 3 ]; then - echo "env::install_file usage: install_file ... " - return 1 - fi - - perms="${@: -1}" # Last argument is permissions - target_dp="${@: -2:1}" # Second-to-last argument is the target directory - sources=("${@:1:$#-2}") # All other arguments are source files - - if [ ! -d "$target_dp" ]; then - echo "env::install_file no install done: target directory '$target_dp' does not exist." - return 1 - fi - - for source_fp in "${sources[@]}"; do - if [ ! -f "$source_fp" ]; then - echo "env::install_file: source file '$source_fp' does not exist." - return 1 - fi - - target_file="$target_dp/$(basename "$source_fp")" - - if ! install -m "$perms" "$source_fp" "$target_file"; then - echo "env::install_file: Failed to install $(basename "$source_fp") to $target_dp" - return 1 - fi - done - } - - export -f install_file - # -------------------------------------------------------------------------------- # closing # -- 2.20.1