Source
To run iogii save the "1 File" from the latest release (below) as iogii and chmod +x it, then run iogii <filename.iog> (it is standalone ruby code with no dependencies).
You can also download "All Source" and run cd src; ruby main.rb <filename.iog>. This includes the original source files, all tests, and site generation code.
The current version is compatible with Ruby 2.7.2 - 3.1.2. And if you use Haskell code generation (with the -hs flag), it is compatible with GHC 8.10.7 - 9.12.2.
These are only the versions I have tested with in Ruby + Haskell, it is likely to work in other versions as well.
I am not using github due to them not respecting licenses by training LLMs on code without crediting said code when used in a response.
1.1 - July 4, 2025
Changes:
- Rename
baseFromfrom#toXand swap arg order, long name is nowfromBase. fromBasecan no longer accept char type (revert to pre 1.0 behavior). The reason being that accepting char types would change coercion behavior of the op it is a low rank overload to, which is a bug (regardless of if it isXor#).- Add
bitsop (p) (reverse digit order fromtoBase) - Thank you lyphyser for a related suggestion and bringing my attention to this pain point. - Add
powOf2op (h) - Add raw lines mode
- Auto parse will now break command line args into lines when newlines present.
Minor changes:
- Improve some error messages.
- Manual tail call optimization for a few ops in ruby implementation (thanks lyphyser for the patch).
- Remove some obsolete mnemonic names.
Bug fixes:
When omitting
"on the last string in the program you can now end it with\"(before it would truncate it). E.g."asdf\" → "asdf\""
1.0.1 - April 28, 2025
Bug fixes:
foldron an empty list now returns initial value (previously returned default value for that type).
1.0 - April 16, 2025
Changes:
'can be used with a UTF-8 char now- The
bin byte strings (""b) can now be implicit if the string contained an invalid UTF-8 character (e.g. 128..255). Note that code.golf does not accept solutions with invalid UTF-8 chars, so this is useless there. - Revert
iterateto take initial value of typeaand useconsinstead ofappend. For 0.3 behavior you could replace[initial] iterate [fn] >with[initial] expand [fn] tail append >(or roll your own). - Implicit values can now be set more than once see here.
- Rename
cutfrom%to# baseFromcan now accept chars too.rangeTocan now accept chars, it starts from the zero of its type (space for char).- Add
isCharClassop%. - Add
cutAnyandscanAnyops (-and+). - Add uppercase versions of string
DGKthat find first occurence of any substring - see slicing ops. - Bug fixes:
- Negative indexes to
getnow return default value instead of first value. initon empty list now returns empty list instead of erroring (problem was in HS only).mdup/mpeekfunctions can now terminate immediately after a loop op. Thanks tubular for the report. See this new syntax section for better clarification of mixed function behavior.- Auto parse in ruby interpreter now counts input as strings if any numbers are not in minimal form, e.g.
--2or04. Before only the Haskell code worked this way, thanks Yewzir for noticing.
- Negative indexes to
0.3 (Beta) - March 18, 2025
Apologies for the large number of major changes. I have no further plans for large changes and should just be making minor changes and fixing bugs/documentation in the future.
Changes:
- Remove block syntax, now ops that create loops act like regular values syntactically
- Removes need for
!and nested rotation trick, instead just place values that needed to be to the left of the arg to the left of the loop op. - Allow
>,to match previous loop creation ops skipping initial match
- Removes need for
>in main function overrides implicit values like how@did.- Additional implicit values beyond the initial input use the
$of where they are used (they are also placed at beginning of unrotated program). - Auto input is removed from the stack if empty and implicits used instead.
- Add set next var (
=). - Remove
[,], and@ops, use new=instead. mdup/mpeekcannot match>(this allows them to always be skipped when matching>, use set next var instead if you needed that).- Rename assignment from
~tosetand addletsyntax (alias forset...del). - Change broadcasting when there is excess rank.
- Better handling of ops with two generic types, e.g. sortBy.
- Fix an assortment of bugs (please report any new ones!).
- Support negation in data format, e.g.
1,2~,3 = [1,-2,3] - Use the system's character encoding rather than bytes. You can force a string literal to still use bytes with
""b. -cannot subtract char from char (use^now), this is to uphold an invariant that makes circular type inference sound.- Change
charClassop to be a unary function that returns all chars in given character class. iteratetakes a list to prepend instead of a single value- empty auto input is
nilinstead of empty string - Empty type defaults to Int when used as a scalar (before errored).
- You can do a vectorized op with a list of empty type (nil), this would usually be useless since result will always be an empty list (before errored).
keeppromotes first via repeat (to easily generate a fixed number of scalars for example).chunkWhenreturns rest of first list when second list runs out- Raw mode for stdin does not break input into lines (also created with
,now).- Add
lines(p) low rank overload to approximate old behavior.
- Add
- Add
peek,mpeek,consDefault,rightJustify,dropUntilAfterSubstring,keepUntilSubstring,getSubstring, andinitops - Remove
or(usemaxorifElseinstead) - Renaming of several ops, the purpose of which is to provide better mnemonics and make some ops more generic.
=→q(equal)s→&(sortBy)q→s(len)#→_(sum)P→.(prod)|→L(abs) (low rank overload)_→~(negate / read)|→.(ord)P→_(words)A→(,(min) (now generic and not a low rank overload).X→x(max) (now generic and not a low rank overload).x→\(setDiff)&→#(reshape)\→|(chunkWhen)W→#(fromBase) (Wnot valid overload with new behavior ofabtypes).
0.2 (Alpha) - Dec 11, 2024
Changes:
- Clarified
reshapebehavior, explained in new Ops page. - Fix bug with
,following token that was split up, e.g.nJ, - Add Graphviz visualizations to online interpreter.
- Support Haskell code generation (~50x speedup + no stack overflow limit)
- Remove
pp shownow prints like Haskell would- Rename
nuketodel - Remove regex
match - Add
charClassop - Output chars mod 256 rather than error if out of range
expanddoes not return the initial value now (thanks UnrelatedString for the suggestion).- Change
transposeto insert default values so that truncation is never needed. - Support input from command line args after
--.
0.1 (Alpha) - Nov 7, 2024
Changes:
- Add more string ops
charRange ^uppercase Ulowercase Lparts P(split on whitespace)chr |,(convert int to char)match +to match regexes.
- Allow unterminated strings.
- Allow implicit args.
- Add auto parsing of input.
@also sets input if none present.- Make
pow ^work more consistently for negative numbers and not overflow for large numbers. - Remove ops:
nfoldProd p,and y - Add ops:
pad p,index .,get g - Rename ops:
chunkWhen.→\transpose\→p(pivot). So that it can be unvectorized and also provide nice overload forprod.digits\→p(it's like transposing a string)lastz→llenl→q(quantity)equalq→=assignment=→~generateg→K(kCopy), no longer genericif→y(yes no)sum_→#negate / read~→_pow10Z→H(hyper)sqrtH→u(unsquare)toBase#→D(digitize)fromBase#,→WbaseFrom(base was). Note that arg order is also swapped - necessary to have vectorized overload.
0.0 (Alpha) - Oct 29, 2024
Initial release. Uses Ruby 3.1.2.
SHA256 sum of 1 File: d325338fab8c0d44a94a2dd85c9deda61d32fe20521e4c125c99d142e37e5a5c