
- •Foreword
- •1. Introduction
- •2. Culture Shock
- •3. Preliminaries
- •Notation Used in This Book
- •Terminology
- •Sentences (statements)
- •Word Formation (tokenizing rules)
- •Numbers
- •Characters
- •Valence of Verbs (Binary and Unary Operators)
- •How Names (Identifiers) Get Assigned
- •Order of Evaluation
- •How Names Are Substituted
- •What a verb (function) looks like
- •Running a J program
- •The Execution Window; Script Windows
- •Names Defined at Startup
- •Step-By-Step Learning: Labs
- •J Documentation
- •Getting Help
- •4. A First Look At J Programs
- •Average Daily Balance
- •Calculating Chebyshev Coefficients
- •5. Declarations
- •Arrays
- •Cells
- •Phrases To Memorize
- •Constant Lists
- •Array-creating Verbs
- •6. Loopless Code I—Verbs Have Rank
- •Examples of Implicit Loops
- •The Concept of Verb Rank
- •Verb Execution—How Rank Is Used (Monads)
- •Controlling Verb Execution By Specifying a Rank
- •Examples Of Verb Rank
- •Negative Verb Rank
- •Verb Execution—How Rank Is Used (Dyads)
- •When Dyad Frames Differ: Operand Agreement
- •Order of Execution in Implied Loops
- •A Mistake To Avoid
- •7. Starting To Write In J
- •8. More Verbs
- •Arithmetic Dyads
- •Boolean Dyads
- •Min and Max Dyads
- •Arithmetic Monads
- •Boolean Monad
- •Operations on Arrays
- •9. Loopless Code II—Adverbs / and ~
- •Modifiers
- •The Adverb Monad u/
- •The adverb ~
- •10. Continuing to Write in J
- •11. Boxing (structures)
- •Terminology
- •Boxing As an Equivalent For Structures In C
- •12. Compound Verbs
- •Verb Sequences—u@:v and u@v
- •Making a Monad Into a Dyad: The Verbs [ and ]
- •Making a Dyad Into a Monad: u&n and m&v
- •13. Empty Operands
- •Execution On a Cell Of Fills
- •Empty cells
- •If Fill-Cells Are Not Enough
- •14. Loopless Code III—Adverbs \ and \.
- •15. Verbs for Arithmetic
- •Dyads
- •Monads (all rank 0)
- •16. Loopless Code IV
- •A Few J Tricks
- •Power/If/DoWhile Conjunction u^:n and u^:v
- •Tie and Agenda (switch)
- •17. More Verbs For Boxes
- •Dyad ; (Link) And Monad ; (Raze)
- •Dyad { Revisited: the Full Story
- •Split String Into J Words: Monad ;:
- •Fetch From Structure: Dyad {::
- •Report Boxing Level: Monad L.
- •18. Verb-Definition Revisited
- •What really happens during m :n and verb define
- •Compound Verbs Can Be Assigned
- •Dual-Valence verbs: u :v
- •The Suicide Verb [:
- •Multi-Line Comments Using 0 :0
- •Final Reminder
- •The Obverse u^:_1
- •Apply Under Transformation: u&.v and u&.:v
- •Defined obverses: u :.v
- •An observation about dyadic verbs
- •20. Performance: Measurement & Tips
- •Timing Individual Sentences
- •Compounds Recognized by the Interpreter
- •Use Large Verb-Ranks! and Integrated Rank Support
- •Shining a Light: The J Performance Monitor
- •21. Input And Output
- •Foreigns
- •File Operations 1!:n; Error Handling
- •Treating a File as a Noun: Mapped Files
- •Format Data For Printing: Monad And Dyad ":
- •Format an Array: 8!:n
- •Format binary data: 3!:n
- •printf, sprintf, and qprintf
- •Convert Character To Numeric: Dyad ".
- •22. Calling a DLL Under Windows
- •Memory Management
- •Aliasing of Variables
- •23. Socket Programming
- •Asynchronous Sockets and socket_handler
- •Names and IP Addresses
- •Connecting
- •Listening
- •Other Socket Verbs
- •24. Loopless Code V—Partitions
- •Find Unique Items: Monad ~. and Monad ~:
- •Apply On Subsets: Dyad u/.
- •Apply On Partitions: Monad u;.1 and u;.2
- •Apply On Specified Partitions: Dyad u;.1 and u;.2
- •Apply On Subarray: Dyad u;.0
- •Apply On All Subarrays: Dyad u;.3 and u;._3
- •Extracting Variable-Length Fields Using ^: and ;.1
- •Example: Combining Adjacent Boxes
- •25. When Programs Are Data
- •Calling a Published Name
- •Using the Argument To a Modifier
- •Invoking a Gerund: m`:6
- •Passing the Definition Of a Verb: 128!:2 (Apply)
- •Passing an Executable Sentence: Monad ". and 5!:5
- •26. Loopless Code VI
- •28. Modifying an array: m}
- •Monad I.—Indexes of the 1s in a Boolean Vector
- •29. Control Structures
- •while./do./end. and whilst./do./end.
- •if./do./else./end., if./do./elseif./do./end.
- •try./catch./catcht./end. and throw.
- •return.
- •assert.
- •30. Modular Code
- •Locales And Locatives
- •Assignment
- •Name Lookup
- •Changing The Current Locale
- •The Shared Locale 'z'
- •Using Locales
- •31. Writing Your Own Modifiers
- •Modifiers That Do Not Refer To x. Or y.
- •Modifiers That Refer To x. Or y.
- •32. Applied Mathematics in J
- •Complex Numbers
- •Matrix Operations
- •Calculus: d., D., D:, and p..
- •Taylor Series: t., t:, and T.
- •Hypergeometric Function with H.
- •Sparse Arrays: Monad and Dyad $.
- •Random Numbers: ?
- •Computational Addons
- •Useful Scripts Supplied With J
- •33. Elementary Mathematics in J
- •Verbs for Mathematics
- •Extended Integers, Rational Numbers, and x:
- •Factors and Primes: Monad p:, Monad and Dyad q:
- •Permutations: A. and C.
- •34. Graphics
- •Plot Package
- •2D Graphics: the gl2 Library
- •Displaying Tabular Data: the Grid Control
- •3D Graphics: OpenGL
- •35. Odds And Ends
- •Dyad # Revisited
- •Boxed words to string: Monad ;:^:_1
- •Spread: #^:_1
- •Choose From Lists Item-By-Item: monad m}
- •Recursion: $:
- •Make a Table: Adverb dyad u/
- •Cartesian Product: Monad {
- •Boolean Functions: Dyad m b.
- •Operations Inside Boxes: u L: n, u S: n
- •Comparison Tolerance !.f
- •Right Shift: Monad |.!.f
- •Generalized Transpose: Dyad |:
- •Monad i: and Dyad i:
- •Fast String Searching: s: (Symbols)
- •Fast Searching: m&i.
- •CRC Calculation
- •Unicode Characters: u:
- •Window Driver And Form Editor
- •Tacit Programming
- •36. Tacit Programs
- •37. First Look At Forks
- •38. Parsing and Execution I
- •39. Parsing and Execution II
- •The Parsing Table
- •Examples Of Parsing And Execution
- •Undefined Words
- •40. Forks, Hooks, and Compound Adverbs
- •Tacit and Compound Adverbs
- •Referring To a Noun In a Tacit Verb
- •41. Readable Tacit Definitions
- •Flatten a Verb: Adverb f.
- •Special Verb-Forms Used in Tacit Definitions
- •43. Common Mistakes
- •Mechanics
- •Programming Errors
- •44. Valedictory
- •45. Glossary
- •46. Error Messages
- •47. Index
29. Control Structures
Your reward for persevering through two dozen chapters on J is to be shown the direct equivalent of if/then/else, for, and while. I have waited until I am sure you realize that you don't need them, and will choose them not because you see no other way to solve a problem, but because you think they are the best way.
if., while., and the rest are classified as control words in J. Their part of speech is 'punctuation', like a parenthesis or LF character. They are allowed only inside explicit definitions, that is to say inside right operands of the : conjunction. If you want to use them from the keyboard or in a script, you must define a verb/adverb/conjunction and then execute it. A control word ends any sentence to its left, as if the control word started with an end-of-line character. We will cover only a few important control sequences here; to find the rest, bring up the J Vocabulary by pressing F1 and click on Controls which is hidden in plain view next to the heading "Vocabulary".
for./do./end. and for_x./do./end.
The allowed forms are:
for. T-block do. block end. for_x. T-block do. block end.
The T-block is evaluated and its result A (that is, the result of the last sentence in the T-block) is saved. block is executed once for each item (item, not atom) of A . If you use the handy for_x. form (where x represents any valid name of your choice), the private variables x and x_index are created, and every time block is executed, x_index is assigned the index of an item of A and x is assigned x_index { A .
The break. and continue. control words do what you would expect.
while./do./end. and whilst./do./end.
The allowed forms are:
while. T-block do. block end. whilst. T-block do. block end.
while. corresponds to while and whilst. corresponds to do while. The 'st' in whilst. stands for 'skip test' (the first time through), so you get one free pass through the loop, just as with do while.
The break. and continue. control words do what you would expect.
if./do./else./end., if./do./elseif./do./end.
The allowed forms (with optional components underlined) are:
167
if. T-block do. block else. block end.
if. T-block do. block elseif. T-block do. block… end.
The flow of control is as you would expect. T-blocks and blocks are both sequences of zero or more J sentences. The result of the last sentence in a T-block provides the result of the T-block . The result of a T-block tests true if its first atom is nonzero, or if it is empty, or if the T-block was empty. The flow of control is as you would expect based on the tests. The sequence elseif. T-block do. block may be repeated as often as desired, but you will be surprised to learn that once you code an elseif. you are not allowed to use else. in the same control structure: no loss, since an empty T-block tests true, and you can just code elseif. do. for the last block.
My antipathy for for. and while. has scarcely been concealed, but I harbor no ill will toward if. . As long as you don't apply it in a loop, if. makes the structure of code obvious and you may use it without remorse. Examples are legion; the form
if. # name =. sentence to create an array do.
code to process name, which is now known to have items end.
is the most common in my code, used to guarantee that a block of code is executed only when a certain noun has a nonzero number of items.
When we first learned about verb definitions we said that the result of a verb was the result of the last sentence executed. Now we must emend that statement: sentences in T-blocks do not affect the result of the verb.
try./catch./catcht./end. and throw.
The simplest form (see the Dictionary for others) is: try. block1 catch. block2 end.
try./catch./end. is the control-structure equivalent of u ::v . block2 is executed only if there was an error during the execution of block1 .
If you want to signal an error, execute the foreign 13!:8 y where y is the error number you want to signal. You can use this in a try. block to transfer execution to the corresponding catch. block.
throw. aborts the explicit definition that is running, and looks in higher-level explicit definitions for a catcht. block to execute. If the previously-running explicit definition was executing in block1 of a try. block that contains a catcht., execution resumes with that catcht. block; otherwise, that explicit definition is also aborted, and the search continues in the next-most-recent explicit definition. If this search does not find a catcht. block to execute, the entire executing sentence is aborted, producing no result.
select./case./fcase./end.
The form is:
168
select. T-block0 case. T-block1 do. block1… end.
T-block0 is evaluated; then the T-blocks of the case. control words are evaluated sequentially until one is found that matches the result of T-block0; the following block is then executed, after which control passes to the sentence following the end. .
fcase. is like case. except that after the block of an fcase. is executed, control passes to the next block rather than to the sentence following the end. .
A T-blockn matches the result of T-block0 if the result of T-block0 is an element of the result of the T-blockn. So, a T-blockn could be 2;3;5 and any of those three values would match it. Before this check is made, each side of the comparison is boxed if it is not boxed already. An empty T-blockn matches anything.
return.
return. ends execution of the definition that is running. The result of the last sentence not in a T-block is the result. Example:
if. T-block do. return-value return. end.
assert.
assert. sentence
assert. fails with an assertion failure error if the result of executing the sentence contains any atoms that are not equal to 1. Note that there is no end. corresponding to the assert., so there may be only a single sentence rather than a
T-block.
169