Release Notes J9.6
< System | ReleaseNotes
Jump to navigation
Jump to search
>> << Pri JfC LJ Phr Dic Voc !: Rel NuVoc wd Help
Work on J9.6 started in November 2023. J9.6.0-beta1 was released 20240102.
Request for Comments
Proposed addition of .. for comment delimiter and ... for line continuation
- The J word .., when not further inflected, is equivalent to NB., starting a comment that ends at the next end-of-line (LF).
- The J word ..., when not further inflected, is equivalent to NB., starting a comment that ends at the next end-of-line (LF), and the following line is appended as J words in place of the ....
Example:
vec =. i. #y .. index vector of length #y adj =. +/ ... add the weighted values vec * y .. weight each element of y by its position
Changes to the J engine
Summary of Changes to the J Language in the release
- New datatype floating16 for double-double floating-point values
- New datatypes integer2 and integer4 for 2-byte and 4-byte integer values
- New primitive verb x c. y converts noun y to the type given by x. x is the desired type/precision, and is the value 3!:0 (aka datatype) will return if applied to the result of c.
- New foreign 9!:33 y controls number of retries for elliptic-curve factoring
- New locative form: name__nn, where nn is a negative integer, looks up name starting in the namespace shown in the debug stack (dbstk''). nn of _1 refers to the topmost frame (the newest suspended frame), _2 to its caller, etc.
- Enhanced foreign x 5!:5 y gives only the selected valence of explicit definitions
- I.^:_1 y defined to return a list of the frequencies of the atoms of y
- 18!:4 removed except as documentation. The cover functions cocurrent and coclass perform the same function they always did, but the underlying 18!:4 itself, which had a quirky definition, can no longer be used directly.
- New foreign 18!:6 y recalculates the Bloom filter for locale y.
- By default, all named locales are marked permanent when created. An option on 18!:3 y allows for creating an impermanent named locale.
- coerase (18!:55) has no effect on permanent locales. To get the same effect, you must manually delete all names from the locale and reset its Bloom filter.
- New modifier train NVC added
- x ($,)!.fill y supported
- x $ y accepts a _ in x, which is replaced by the value needed to use all of y. Also ($,). The verb can be modified by !.v to adjust the value used for _. Adám Brudzewsky had the idea for this and provided the complete spec. Details here.
- incompatible language change: x m&v y and x u&n y removed from the language. They caused confusion. Rewrite as x (m v ])^:[ y and x u&n@]^:[ y.
- incompatible language change: rank of q: changed to _ 0 0. With the monadic rank 0, as formerly, fill produced invalid results. Also, the inverse is changed from */ to */"1.
- >!.f y supported. This can be used to get the effect of changing the framing fill.
- Z: y gives iteration counts for the currently executing Fold
- 9!:5 y, which allowed you to save a little space by discarding the original text of explicit definitions, now has no effect.
- 13!:13 (stack detail) adds columns giving locale name and internal representation, and allows the y argument to select the desired columns
- [x] u^:v^:_. y is DoWhile without convergence test: repeat u as long as v returns 1
- x v0`v1} y, previously undefined, computes (x v0 y) (x v1 y)} y
J9.6.0-beta26 (unreleased)
- x i. y runs inplace if possible when x is a list and y is an atom or list of the same precision
- x i. y makes a more accurate decision of whether to use sequential search vs hashing
- a. i. y supported by special code
- a.&i. y supported by special code
- {&a. y supported by special code, also {&a."n y
- [x] 6!:2 y includes only the time spent after preprocessing the sentence
- Bug fix: taking AR of undefined u/v hung the system
- Special code for f&.(a.&i.) y removed. It gave erroneous results when f is not a pure function, and spent much execution time testing whether f is equivalent to (m b.). If f is a pure function, use ((f&.(a.&i.) a.) {~ a. i. ]). If you need (m b.)&.(a.&i.), write just that.
- Bug fix: Sentence with undefined u/v could crash
- [x] 6!:2 y now gives the time required when the sentence is executed as if from an explicit definition (since that is how most sentences are executed). Formerly time spent preprocessing the sentence (including word formation, parsing parenthesized primitives, and setting up for debug) was included in the overall time. The reported time is now quite precise even for very short sentences, provided you run 6!:2 in the correct environment.
- Invalid single-word sentences in explicit definitions (e. g. {{ =. }}) are detected at definition time rather than waiting for execution
- 2 Z: y caused explicit definitions to execute invalid sentences (introduced in beta-22)
J9.6.0-beta25 (the current beta)
- Bug fix: ;@:(<&f) failed when f returned a pyx (introduced in beta-24)
J9.6.0-beta24
- x v0`v1} y, previously undefined, computes (x v0 y) (x v1 y)} y
- Fast path added for x -. y and x ([-.-.) y when an argument is empty
- Fast path added for atom { array when the atom can hold the result
- Fast path added for empty { array
- x , y recoded: faster and detects inplaceability better, with fast path when one argument is empty
- When a failing pyx is opened, the full error message from the pyx is included in the error display
- Bug fix: repeatedly reloading a suspended function caused loss of stack space
- Bug fix: reusability flags set incorrectly for array , atom
- Bug fix: (13 : n) sometimes crashed when translating an NVV fork
J9.6.0-beta23
- Bug fix: crash sometimes when dbr 1 issued during suspension
- Bug fix: signaling NaNs near valid data could create NaN error (introduced in beta-19)
- 13!:13 (stack detail) adds columns giving locale name and internal representation, and allows the y argument to select the desired columns
- [x] u^:v y recoded
- [x] u^:v y streamlined when v returns boolean/integer 0/1
- [x] u^:_ y (converge) performs a couple of extra iterations to polish the result
- [x] u^:v^:_. y is DoWhile without convergence test: repeat u as long as v returns 1
- x u^:(v0`v1`v2) y does not execute v0 or u if the result of v1 is atomic 0, and executes in place where possible
- x u^:_1 y executes x&u^:_1 in place where possible
J9.6.0-beta22
- Bug fix: creating a great many small boxes sometimes crashed
- Fold family (F. F:. etc.) now coded internally rather than using a J addon, faster
J9.6.0-beta20
- Bug fix: Sentences ending with a mismatched ) sometimes corrupted memory
- Internal linkage to arithmetic primitives rewritten to reduce stack latency
- Primitive code for commutative arithmetic primitives shared to reduce I-cache footprint
- New error no result used when Fold terminates without executing anything
J9.6.0-beta19
- Bug fix: u^:_1 looked at stale fields if u was assigned inside a different explicit definition
- Name lookups now automatically cached for a short while
- Bug fix: (QP *"r DP) did not convert DP to QP
- Atomic arithmetic primitives rewritten, 5-10% faster
J9.6.0-beta18
- Bug fix: erratic behavior when script loaded during debug suspension (introduced in beta-16)
- 9!:5 y, which allowed you to save a little space by discarding the original text of explicit definitions, now has no effect.
J9.6.0-beta17
- Special code for <.[!.f]@(2&^.) and variants (also >.). This code was contributed by Marcin Żołek.
- incompatible language change: rank of q: changed to _ 0 0. With the monadic rank 0, as formerly, fill produced invalid results. Also, the inverse is changed from */ to */"1.
- >!.f y supported. This can be used to get the effect of changing the framing fill.
- Z: y gives iteration counts for the currently executing Fold
J9.6.0-beta16
- incompatible language change: x m&v y and x u&n y removed from the language. They caused confusion. Rewrite as x (m v ])^:[ y and x u&n@]^:[ y.
- During debug suspension, reloading a name in execution is now allowed without error if the value is not changed. If the value is changed, the name is updated and suspension ends.
J9.6.0-beta15
- x |. y runs inplace when possible
- x ($,)!.fill y supported
- x $ y accepts a _ in x, which is replaced by the value needed to use all of y. Also ($,). The verb can be modified by !.v to adjust the value used for _. Adám Brudzewsky had the idea for this and provided the complete spec. Details here.
J9.6.0-beta14
- Add new modifier train NVC
- Assignments ended by ) allow inplacing. Ex: (nm =: nm , 'a') , 'b'
- ([x] 128!:10 y) (LUP decomposition) finds a suitable P
J9.6.0-beta13
- Fix mismatch between private locale and implied locale
J9.6.0-beta12
- Fix for crash in postmortem debugging
J9.6.0-beta11
- Direct definitions (created using {{ }}) are displayed on the console with {{ }}. In other linear representations they continue to use m : 0.
J9.6.0-beta10
- New foreign 18!:6 y recalculates the Bloom filter for locale y.
- By default, all named locales are marked permanent when created. An option on 18!:3 y allows for creating an impermanent named locale.
- coerase (18!:55) has no effect on permanent locales. To get the same effect, you must manually delete all names from the locale and reset its Bloom filter. Supporting the very rare case of deleting a named locale is not worth the burden it imposes on a multithreaded system.
J9.6.0-beta9
- 18!:4 removed except as documentation. The cover functions cocurrent and coclass perform the same function they always did, but the underlying 18!:4 itself, which had a quirky definition, can no longer be used directly.
- Execution of named functions rewritten, simpler & faster
- If you delete the implied locale, the implied locale is set to z (previously you were left with no implied locale and no path)
J9.6.0-beta8
- Warning message given if 18!:4 is used. 18!:4 will be removed from beta9.
- Improvements to the debugger and its interaction with Jqt and JHS, contributed by Marcin Żołek
J9.6.0-beta7
- Beta users should install this beta before installing later betas. This will update libraries that are used in later betas
J9.6.0-beta6 withdrawn
J9.6.0-beta5
- I.^:_1 y defined to return a list of the frequencies of the atoms of y
- execution of explicit definitions rewritten: faster, leaner
J9.6.0-beta4
- 55 T. threadpool# deletes a thread from the specified threadpool
- Undefined sentences, such as NB watch out, display the 'noun result was required' message. This can be controlled using 9!:55
- Anonymous explicit definitions are now given a place in the debug stack. Example: myverb =: {{ x + y }}"0
- 13!:13 (dbstk) includes only the active valence of the text of the executing entity
J9.6.0-beta3
- Compensated summation now gives infinite result rather than NaN error where possible
- m!:n (that is, the function that creates the derived verb) rewritten, a little faster and less memory
- Enhanced foreign x 5!:5 y gives only the selected valence of explicit definitions
J9.6.0-beta2
- The special forms ((q i.]) { p"_) y and (q&i. { p"_) y are no longer recognized. They are superseded by (p {~ q i. ]) y
- (p {~ q i. ]) y runs inplace if possible (also x |.!.fill y)
- Virtual arguments to a task are realized in the task rather than in the caller, where possible
- x , y faster and better when one argument is empty
- fixed-precision datatypes given higher conversion priority than J native numbers
- 256-bit code for +/ y and +/@:*"1 y when y is floating16
- Fast support for +/ y, +/\ y, and +/\. y when y is integer2 or integer4
- q: y on extended integer y now tries multiple random elliptic curves instead of just one. The default number is 3 but can be changed by 9!:33 y
- New locative form: name__nn, where nn is a negative integer, looks up name starting in the namespace shown in the debug stack (dbstk''). nn of _1 refers to the topmost frame (the newest suspended frame), _2 to its caller, etc.
- New feature: postmortem debugging allows you to inspect the situation after a sentence failed while debugging wasn't turned on.
- screen display of a tacit verb uses default formatting instead of maximum precision
J9.6.0-beta1
- New datatype floating16 for double-double floating-point values
- New datatypes integer2 and integer4 for 2-byte and 4-byte integer values
- New primitive verb x c. y converts noun y to the type given by x. x is the desired type/precision, and is the value 3!:0 (aka datatype) will return if applied to the result of c.