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.0.1 - April 28, 2025
- 1 File
- All Source
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