Lamed - MrKaszeba19/PapajLang GitHub Wiki

Lamed (v.0.5.2) is an upcoming version of RPN Calculator (now Papaj), which was released on December 18, 2021. It is named after the twelfth letter of Hebrew alphabet – lamed (ל).

Details and features

  • Name: Lamed
  • Version Code: 0.5.2
  • Version Type: Generation 3 build
  • Release Date: December 18, 2021
  • Stable precedessor: Khaf (v.0.5.1)
  • Stable successor: Mem (v.0.5.3)
  • Language: FreePascal
  • Lines of code: 13720
  • Number of functions: 530 + user-defined ones
  • Maximum number of instructions: de facto no limit (depends how many you can put in AnsiString, which has limit of either 2,147,483,647 (32 bit) or 9,223,372,036,854,775,807 chars (64 bit))
  • Number of entity types: 9 (10 with quasitypes)
  • Number of packages: 6
  • Tested on:
    • systems: Windows (2000, Vista, 7, 8.1, Win10), Linux (Ubuntu, Debian, Manjaro)
    • architectures: i386/x86 (32 bit), amd64/x64 (64 bit)

Code and binaries

  • You can download the binaries/executables of Lamed here.
  • You can find its source code here.

List of confirmed changes

First release

  • all changes included in the updates of 0.5.1
  • Packages now require @use() to be used.
  • Rebuild of console app core
  • Reintroduction of flags
  • for-each const loop
  • syntax rework – RPN does not require spaces between (), [] and {} – allow e.g. if (true) {true}
    • Note that it does not apply between }{, )(, ][if(true){true} is not allowed
  • Vanilla functions:
    • shl, shr
    • numsort
    • callWhile, callUntil
    • swapAt, swapAt2
  • GUI Application:
    • Extended language support: Afrikaans, Croatian, French, Dutch, German, Macedonian, Norwegian, Portuguese, Russian, Serbian, Slovene, Swedish
    • More advanced file management
    • Source code window and output window are resizable
    • Switch that allows the output window be cleared after each run or not
    • Ability to run script in an external terminal window
  • Allow $t $f filter with functions instead of logical expressions (for $t being either array or string)
  • Allow $t $f cut with functions instead of logical expressions (for $t being either array or string)
  • Array package functions:
    • cut
    • cutZeros, cutEmptyStrings, cutNulls
    • distinctNumbers, distinctStrings, distinct
    • reduceStdDev
    • first, last
    • crushBy
    • pad, padRight, padLeft, padEntities, padEntitiesRight, padEntitiesLeft, padSpaces, padSpacesRight, padSpacesLeft, padNulls, padNullsRight, padNullsLeft, padZeros, padZerosRight, padZerosLeft, padEmptyStrings, padEmptyStringsRight, padEmptyStringsLeft
    • randomFrom
    • reduceGCD, reduceLCM
    • sort
    • trim, trimLeft, trimRight, trimNulls, trimNullsRight, trimNullsLeft, trimEntities, trimEntitiesRight, trimEntitiesLeft
  • Date package functions:
    • isInRange, isDateInRange, isTimeInRange
    • addWeek
  • Math package functions:
    • arcsec, arccsc
    • sgn/sign – sign function
    • inverse hyperbolic functions – arsinh, arcosh, artanh, arcoth, arsech, arcsch
    • moment, quantile
    • tertile, quartile, octile, decile, hexadecile, percentile
    • Beta distribution functions: distBeta, funcBeta, randomBeta, genBeta
    • Fisher-Snedecor (F) distribution functions: distF, funcF, randomF, genF
    • factorize, primeDistribution, leastPrimeDivisor
    • randomIntRange, randomRealRange
    • euclidean and its alias bezoutCoefs
    • erf, erfc
    • fomega, fOmega (and countDistinctFactors, countAllFactors as aliases)
    • fLiouville and fLambda as alias
    • isSquareFree
  • String package functions:
    • padChars, padCharsRight, padCharsLeft
    • trimChars, trimCharsRight, trimCharsLeft
    • quoted, apostrophed, enclosed
    • map
    • reduce, reduceLeft, reduceLeftFromFirst, reduceRight, reduceRightFromLast
    • filter, cut
    • first, last
    • delete, copies, divide, removeMatching, translate
    • compare, isEmpty
  • Move String.system to Console.system
  • Console package functions:
    • delay (for Unix)
    • UserName, UserHome
    • HostName
    • OSName, OSDistribution (and its alias OSDist), OSVersion
    • CPUBits, CPUArchitecture (and its alias CPUArch)
    • UserShell (for Unix only)
  • Directives of @fixprecision(X), @maxprecision(X)
  • Arithmetics on strings
  • rebuild fit for variables
  • Runtime params rebuild
  • fix bugs and errors
    • "." bug
    • multidimensional arrays issue
    • arrays in arrays issue
    • T distribution bug

Update #1 of February 11, 2022

  • fix String.quoted bug
  • fix quotes parsing bug
  • fix Array.getAt and String.getAt bug
  • fix xdg-terminal bug
  • add mate-terminal support
  • add functions: String.quoted2, String.apostrophed2

Update #2 of March 4, 2022

  • fix if-else bug with entities instead of instruction blocks
  • add functions: Math.coprimes, Math.modularPower, Math.modPower, Math.modPow, Math.modularInverse, Math.modularMulInverse, Math.modMulInv, Math.isCarmichael
  • add item index in for-each loop – for ( index item : $T ) and for ( const index item : $T )
  • add Unix scripts support (shebangs)
  • add script that installs rpn to /bin for all users

Examples of code of version 0.5.2

  1. Hello world
"Hello world!" println
  1. Factorial (different methods)
// using recursive function
function {
    >n
    if ( n 0 = ) {
        1
    } else { 
        n n -- factorial * 
    }
} >factorial

scan toNumber factorial
// using stack-aggregating function "seq"
scan toNumber 1 1 seq
all product
// using Math package
@uses(Math)
scan toNumber factorial
  1. Fibonacci sequence (different methods)
// using times-loop
function {
    >n
    if ( n 0 = ) { 
        0
    } elif ( n 1 = ) {
        1
    } else {
        // put 2 initial values we will add up
        0 1
        n -- times {
            // duplicate the values and create a sum
            2 copy +
            // remove the LHS value: reverse 3 elements, remove the last one and order them back
            3 rev rem swap
            // so now we have a RHS value and the added one as the new values to sum
            // and so on n-2 more times
        } 
        swap rem
    }
} >fib

scan toNumber fib
// using classical for-loop
function {
    >n
    if ( n 0 = ) { 
        0
    } elif ( n 1 = ) {
        1
    } else {
        // put 2 initial values we will add up
        0 1
        for ( 2 -> i ; i n <= ; i ++ -> i ) {
            // duplicate the values and create a sum
            2 copy +
            // remove the LHS value: reverse 3 elements, remove the last one and order them back
            3 rev rem swap
            // so now we have a RHS value and the added one as the new values to sum
            // and so on up to i <= n
        } 
        swap rem
    }
} >fib

scan toNumber fib
// using Math package
@use(Math)
scan toNumber fibonacci
  1. Checking if there is a person more stupid than Forrest Gump in a group of N people using normal distribution
@silent
@use(Math)
@use(String)
@use(Array)

"Enter the population size: " print
scan toNumber -> n

[ $n 100 15 genNorm ] reduceMin -> m1


"Sample's Lowest IQ: " $m1 toString concat println
"Forrest Gump's IQ:  70" println
  1. Sorting an array
// sorting an array with 10 random integers from a range [0..99]
@use(Array)
[ 10 times { 100 random } ] sortNumbers println
// sorting a user-defined array
// without double exclamation at push, making it return the new array that is later assigned to a variable
@use(Array)
@use(String)
"Set array length: " print
scan toNumber -> n
[] -> T
1 -> i
n times {
	"Push the " i toString ". element: " 2 times concat print
	T scan toNumber push -> T
	i ++ -> i
}
T sortNumbers println
// sorting a user-defined array
// with double exclamation at push, making it act like a procedure
@use(Array)
@use(String)
"Set array length: " print
scan toNumber -> n
[] -> T
1 -> i
n times {
	"Push the " i toString ". element: " 2 times concat print
	T scan toNumber push!!
	i ++ -> i
}
T sortNumbers println
  1. Dirichlet Convolution
// computing Dirichlet's convolution of 1/n and sin(n) in a point defined by user
// using basic sum through array elements
@use(Math)

function { -1 ^ } -> f
function { sin } -> g

function {
	>k >g >f
	0 -> sum
	for ( $i : [ $k genNaturalDivisors ] ) {
		$i f $k $i div g * $sum + -> $sum
	}
	$sum
} -> DirichletConvolve

scan toNumber -> $n
$f $g $n DirichletConvolve
// computing Dirichlet's convolution of 1/n and sin(n) in a point defined by user
// using array mapping and reducing
@use(Math)
@use(Array)

function { -1 ^ } -> f
function { sin } -> g

function {
	>k >g >f
	[ $k genNaturalDivisors ] 
		fun{ >i 
                      $i f $k $i div g * 
		} map
		reduceSum
} -> DirichletConvolve

scan toNumber -> $n
$f $g $n DirichletConvolve
// computing Dirichlet's convolution of 1/n and sin(n) in a point defined by user
// using array mapping and reducing
// with 0.5.2 features
@use(Math)
@use(Array)

function { inv } -> f
function { sin } -> g

function (f g k) {
	[$k genNaturalDivisors] 
		fun{ >i 
                      $i f $k $i div g * 
		} map
		reduceSum
} -> DirichletConvolve

scan toNumber -> $n
$f $g $n DirichletConvolve
⚠️ **GitHub.com Fallback** ⚠️