Arithmetic / Logic: Difference between revisions

From MemCP
Jump to navigation Jump to search
(Created page with "= Arithmetic / Logic = The '''Arithmetic / Logic''' module provides essential mathematical operations and logical comparisons for the SCM programming language. This module includes: * '''Type checking''': Functions to verify data types (int?, number?, nil?) * '''Basic arithmetic''': Addition (+), subtraction (-), multiplication (*), and division (/) * '''Comparison operations''': All standard comparison operators (>, <, >=, <=, equal?) * '''Logical operations''': Boole...")
 
(Refresh MemCP documentation: accuracy, operational guidance, performance profile and maintained API reference)
 
(2 intermediate revisions by one other user not shown)
Line 1: Line 1:
<!-- Copyright (C) 2026 Carl-Philip Haensch -->
<!-- SPDX-License-Identifier: GPL-3.0-or-later -->
<span id="arithmetic--logic"></span>
= Arithmetic / Logic =
= Arithmetic / Logic =


The '''Arithmetic / Logic''' module provides essential mathematical operations and logical comparisons for the SCM programming language. This module includes:
<!-- Generated from MemCP c42e19eba on 2026-08-27; do not edit manually. -->
<div class="mw-message-box mw-message-box-notice">Generated from MemCP commit <code>c42e19eba</code> on 27 August 2026. See [[Full SCM API documentation]].</div>


* '''Type checking''': Functions to verify data types (int?, number?, nil?)
The '''Arithmetic / Logic''' module provides the mathematical and logical foundation of MemCP Scheme and compiled SQL expressions. It includes:
* '''Basic arithmetic''': Addition (+), subtraction (-), multiplication (*), and division (/)
* '''Comparison operations''': All standard comparison operators (>, <, >=, <=, equal?)
* '''Logical operations''': Boolean negation (!, not) and advanced equality checks
* '''Mathematical functions''': Min/max operations and rounding functions (floor, ceil, round)


These functions form the mathematical foundation for calculations and logical decision-making in SCM programs.
* '''Type predicates''' for integers, numbers, NULL/nil, booleans, and related runtime values;
* '''Arithmetic''' such as addition, subtraction, multiplication, division, modulo, and numeric conversion;
* '''Comparison and SQL truth''' including ordering, equality, NULL-aware predicates, and three-valued-logic helpers;
* '''Mathematical functions''' for rounding, extrema, powers, logarithms, and aggregate reduction;
* '''Bitwise and optimizer primitives''' used by generated query plans.


← Back to [[Full SCM API documentation]]
Functions intended only for generated plans remain documented because they are part of the runtime interface, but application code should prefer the corresponding SQL or ordinary Scheme operation where one exists.


<span id="int"></span>
== int? ==
== int? ==


Line 19: Line 25:
'''Allowed number of parameters:''' 1–1
'''Allowed number of parameters:''' 1–1


'''Parameters:'''
<span id="parameters"></span>
=== Parameters ===
 
* '''value''' (<code>any</code>): value
* '''value''' (<code>any</code>): value


'''Returns:''' <code>bool</code>
<span id="returns"></span>
=== Returns ===


* '''value''' (<code>bool</code>)
<span id="number"></span>
== number? ==
== number? ==


Line 30: Line 42:
'''Allowed number of parameters:''' 1–1
'''Allowed number of parameters:''' 1–1


'''Parameters:'''
<span id="parameters-1"></span>
=== Parameters ===
 
* '''value''' (<code>any</code>): value
* '''value''' (<code>any</code>): value


'''Returns:''' <code>bool</code>
<span id="returns-1"></span>
=== Returns ===
 
* '''value''' (<code>bool</code>)
 
<span id="symbol"></span>
== symbol? ==
 
tells if the value is a symbol
 
'''Allowed number of parameters:''' 1–1
 
<span id="parameters-2"></span>
=== Parameters ===
 
* '''value''' (<code>any</code>): value
 
<span id="returns-2"></span>
=== Returns ===
 
* '''value''' (<code>bool</code>)


== + ==
== + ==
Line 39: Line 73:
adds two or more numbers
adds two or more numbers


'''Allowed number of parameters:''' 2–1000
'''Allowed number of parameters:''' 0–10000


'''Parameters:'''
<span id="parameters-3"></span>
* '''value...''' (<code>number</code>): values to add
=== Parameters ===


'''Returns:''' <code>number</code>
* '''value...''' (<code>number</code>): values to add ''(variadic)''
 
<span id="returns-3"></span>
=== Returns ===
 
* '''value''' (<code>number</code>)
 
== sql_sum_reduce ==
 
adds two SQL SUM values while treating NULL as the empty aggregate identity
 
'''Allowed number of parameters:''' 2–2
 
<span id="parameters-4"></span>
=== Parameters ===
 
* '''left''' (<code>number|nil</code>): partial sum
* '''right''' (<code>number|nil</code>): next value
 
<span id="returns-4"></span>
=== Returns ===
 
* '''value''' (<code>number|nil</code>)


== - ==
== - ==
Line 50: Line 106:
subtracts two or more numbers from the first one
subtracts two or more numbers from the first one


'''Allowed number of parameters:''' 2–1000
'''Allowed number of parameters:''' 0–10000
 
<span id="parameters-5"></span>
=== Parameters ===
 
* '''value...''' (<code>number</code>): values ''(variadic)''
 
<span id="returns-5"></span>
=== Returns ===
 
* '''value''' (<code>number</code>)
 
== sql_add_numeric_literals ==


'''Parameters:'''
adds two SQL numeric literals using their exact decimal spellings
* '''value...''' (<code>number</code>): values


'''Returns:''' <code>number</code>
'''Allowed number of parameters:''' 2–2


<span id="parameters-6"></span>
=== Parameters ===
* '''a''' (<code>number</code>): left literal
* '''b''' (<code>number</code>): right literal
<span id="returns-6"></span>
=== Returns ===
* '''value''' (<code>number</code>)
== sql_sub_numeric_literals ==
subtracts two SQL numeric literals using their exact decimal spellings
'''Allowed number of parameters:''' 2–2
<span id="parameters-7"></span>
=== Parameters ===
* '''a''' (<code>number</code>): left literal
* '''b''' (<code>number</code>): right literal
<span id="returns-7"></span>
=== Returns ===
* '''value''' (<code>number</code>)
<span id="-1"></span>
== * ==
== * ==


multiplies two or more numbers
multiplies two or more numbers


'''Allowed number of parameters:''' 2–1000
'''Allowed number of parameters:''' 0–10000


'''Parameters:'''
<span id="parameters-8"></span>
* '''value...''' (<code>number</code>): values
=== Parameters ===


'''Returns:''' <code>number</code>
* '''value...''' (<code>number</code>): values ''(variadic)''


<span id="returns-8"></span>
=== Returns ===
* '''value''' (<code>number</code>)
<span id="-2"></span>
== / ==
== / ==


divides two or more numbers from the first one
divides two or more numbers from the first one


'''Allowed number of parameters:''' 2–1000
'''Allowed number of parameters:''' 0–10000
 
<span id="parameters-9"></span>
=== Parameters ===
 
* '''value...''' (<code>number</code>): values ''(variadic)''


'''Parameters:'''
<span id="returns-9"></span>
* '''value...''' (<code>number</code>): values
=== Returns ===


'''Returns:''' <code>number</code>
* '''value''' (<code>number</code>)


== <= ==
== mod ==


compares two numbers or strings
returns the remainder of integer division (modulo)


'''Allowed number of parameters:''' 2–2
'''Allowed number of parameters:''' 2–2


'''Parameters:'''
<span id="parameters-10"></span>
* '''value...''' (<code>any</code>): values
=== Parameters ===
 
* '''a''' (<code>number</code>): dividend
* '''b''' (<code>number</code>): divisor
 
<span id="returns-10"></span>
=== Returns ===
 
* '''value''' (<code>number</code>)
 
<span id="-3"></span>
== &lt;= ==
 
compares two numbers or strings; returns nil if either value is nil
 
'''Allowed number of parameters:''' 2–2
 
<span id="parameters-11"></span>
=== Parameters ===
 
* '''a''' (<code>any</code>): first value
* '''b''' (<code>any</code>): second value
 
<span id="returns-11"></span>
=== Returns ===


'''Returns:''' <code>bool</code>
* '''value''' (<code>bool</code>)


== < ==
<span id="-4"></span>
== &lt; ==


compares two numbers or strings
compares two numbers or strings; returns nil if either value is nil


'''Allowed number of parameters:''' 2–2
'''Allowed number of parameters:''' 2–2


'''Parameters:'''
<span id="parameters-12"></span>
* '''value...''' (<code>any</code>): values
=== Parameters ===


'''Returns:''' <code>bool</code>
* '''a''' (<code>any</code>): first value
* '''b''' (<code>any</code>): second value


== > ==
<span id="returns-12"></span>
=== Returns ===


compares two numbers or strings
* '''value''' (<code>bool</code>)
 
<span id="-5"></span>
== &gt; ==
 
compares two numbers or strings; returns nil if either value is nil


'''Allowed number of parameters:''' 2–2
'''Allowed number of parameters:''' 2–2


'''Parameters:'''
<span id="parameters-13"></span>
* '''value...''' (<code>any</code>): values
=== Parameters ===


'''Returns:''' <code>bool</code>
* '''a''' (<code>any</code>): first value
* '''b''' (<code>any</code>): second value


== >= ==
<span id="returns-13"></span>
=== Returns ===


compares two numbers or strings
* '''value''' (<code>bool</code>)
 
<span id="-6"></span>
== &gt;= ==
 
compares two numbers or strings; returns nil if either value is nil


'''Allowed number of parameters:''' 2–2
'''Allowed number of parameters:''' 2–2


'''Parameters:'''
<span id="parameters-14"></span>
* '''value...''' (<code>any</code>): values
=== Parameters ===


'''Returns:''' <code>bool</code>
* '''a''' (<code>any</code>): first value
* '''b''' (<code>any</code>): second value


<span id="returns-14"></span>
=== Returns ===
* '''value''' (<code>bool</code>)
<span id="equal"></span>
== equal? ==
== equal? ==


Line 129: Line 282:
'''Allowed number of parameters:''' 2–2
'''Allowed number of parameters:''' 2–2


'''Parameters:'''
<span id="parameters-15"></span>
* '''value...''' (<code>any</code>): values
=== Parameters ===
 
* '''a''' (<code>any</code>): first value
* '''b''' (<code>any</code>): second value
 
<span id="returns-15"></span>
=== Returns ===


'''Returns:''' <code>bool</code>
* '''value''' (<code>bool</code>)


<span id="equal-1"></span>
== equal?? ==
== equal?? ==


Line 140: Line 300:
'''Allowed number of parameters:''' 2–2
'''Allowed number of parameters:''' 2–2


'''Parameters:'''
<span id="parameters-16"></span>
* '''value...''' (<code>any</code>): values
=== Parameters ===
 
* '''a''' (<code>any</code>): first value
* '''b''' (<code>any</code>): second value


'''Returns:''' <code>bool</code>
<span id="returns-16"></span>
=== Returns ===


* '''value''' (<code>bool</code>)
== sql_not ==
negates a SQL predicate while preserving nil as UNKNOWN
'''Allowed number of parameters:''' 1–1
<span id="parameters-17"></span>
=== Parameters ===
* '''value''' (<code>any</code>): SQL predicate value
<span id="returns-17"></span>
=== Returns ===
* '''value''' (<code>bool|nil</code>)
== equal_collate ==
performs SQL equality with a specified collation (e.g. *_ci case-insensitive, *_bin case-sensitive); returns nil if either arg is nil
'''Allowed number of parameters:''' 3–3
<span id="parameters-18"></span>
=== Parameters ===
* '''a''' (<code>any</code>): left side
* '''b''' (<code>any</code>): right side
* '''collation''' (<code>string</code>): collation name
<span id="returns-18"></span>
=== Returns ===
* '''value''' (<code>bool</code>)
== notequal_collate ==
performs SQL inequality with a specified collation; returns nil if either arg is nil
'''Allowed number of parameters:''' 3–3
<span id="parameters-19"></span>
=== Parameters ===
* '''a''' (<code>any</code>): left side
* '''b''' (<code>any</code>): right side
* '''collation''' (<code>string</code>): collation name
<span id="returns-19"></span>
=== Returns ===
* '''value''' (<code>bool</code>)
<span id="-7"></span>
== ! ==
== ! ==


Line 151: Line 370:
'''Allowed number of parameters:''' 1–1
'''Allowed number of parameters:''' 1–1


'''Parameters:'''
<span id="parameters-20"></span>
=== Parameters ===
 
* '''value''' (<code>bool</code>): value
* '''value''' (<code>bool</code>): value


'''Returns:''' <code>bool</code>
<span id="returns-20"></span>
=== Returns ===
 
* '''value''' (<code>bool</code>)


== not ==
== not ==
Line 162: Line 386:
'''Allowed number of parameters:''' 1–1
'''Allowed number of parameters:''' 1–1


'''Parameters:'''
<span id="parameters-21"></span>
=== Parameters ===
 
* '''value''' (<code>bool</code>): value
* '''value''' (<code>bool</code>): value


'''Returns:''' <code>bool</code>
<span id="returns-21"></span>
=== Returns ===
 
* '''value''' (<code>bool</code>)


<span id="nil"></span>
== nil? ==
== nil? ==


Line 173: Line 403:
'''Allowed number of parameters:''' 1–1
'''Allowed number of parameters:''' 1–1


'''Parameters:'''
<span id="parameters-22"></span>
=== Parameters ===
 
* '''value''' (<code>any</code>): value
* '''value''' (<code>any</code>): value


'''Returns:''' <code>bool</code>
<span id="returns-22"></span>
=== Returns ===
 
* '''value''' (<code>bool</code>)


== min ==
== min ==
Line 182: Line 417:
returns the smallest value
returns the smallest value


'''Allowed number of parameters:''' 1–1000
'''Allowed number of parameters:''' 0–10000


'''Parameters:'''
<span id="parameters-23"></span>
* '''value...''' (<code>number|string</code>): value
=== Parameters ===


'''Returns:''' <code>number|string</code>
* '''value...''' (<code>number|string</code>): value ''(variadic)''
 
<span id="returns-23"></span>
=== Returns ===
 
* '''value''' (<code>number|string</code>)


== max ==
== max ==
Line 193: Line 433:
returns the highest value
returns the highest value


'''Allowed number of parameters:''' 1–1000
'''Allowed number of parameters:''' 0–10000


'''Parameters:'''
<span id="parameters-24"></span>
* '''value...''' (<code>number|string</code>): value
=== Parameters ===


'''Returns:''' <code>number|string</code>
* '''value...''' (<code>number|string</code>): value ''(variadic)''
 
<span id="returns-24"></span>
=== Returns ===
 
* '''value''' (<code>number|string</code>)


== floor ==
== floor ==
Line 206: Line 451:
'''Allowed number of parameters:''' 1–1
'''Allowed number of parameters:''' 1–1


'''Parameters:'''
<span id="parameters-25"></span>
=== Parameters ===
 
* '''value''' (<code>number</code>): value
* '''value''' (<code>number</code>): value


'''Returns:''' <code>number</code>
<span id="returns-25"></span>
=== Returns ===
 
* '''value''' (<code>number</code>)


== ceil ==
== ceil ==
Line 217: Line 467:
'''Allowed number of parameters:''' 1–1
'''Allowed number of parameters:''' 1–1


'''Parameters:'''
<span id="parameters-26"></span>
=== Parameters ===
 
* '''value''' (<code>number</code>): value
* '''value''' (<code>number</code>): value


'''Returns:''' <code>number</code>
<span id="returns-26"></span>
=== Returns ===
 
* '''value''' (<code>number</code>)


== round ==
== round ==
Line 228: Line 483:
'''Allowed number of parameters:''' 1–1
'''Allowed number of parameters:''' 1–1


'''Parameters:'''
<span id="parameters-27"></span>
=== Parameters ===
 
* '''value''' (<code>number</code>): value
 
<span id="returns-27"></span>
=== Returns ===
 
* '''value''' (<code>number</code>)
 
== sql_decimal_output ==
 
normalizes a DECIMAL-derived result to its declared output scale
 
'''Allowed number of parameters:''' 2–2
 
<span id="parameters-28"></span>
=== Parameters ===
 
* '''value''' (<code>number|nil</code>): DECIMAL-derived value
* '''scale''' (<code>int</code>): declared decimal scale
 
<span id="returns-28"></span>
=== Returns ===
 
* '''value''' (<code>number|nil</code>)
 
== sql_abs ==
 
SQL ABS(): returns absolute value, NULL-safe
 
'''Allowed number of parameters:''' 1–1
 
<span id="parameters-29"></span>
=== Parameters ===
 
* '''value''' (<code>number</code>): value
 
<span id="returns-29"></span>
=== Returns ===
 
* '''value''' (<code>number</code>)
 
== sqrt ==
 
returns the square root of a number
 
'''Allowed number of parameters:''' 1–1
 
<span id="parameters-30"></span>
=== Parameters ===
 
* '''value''' (<code>number</code>): value
* '''value''' (<code>number</code>): value


'''Returns:''' <code>number</code>
<span id="returns-30"></span>
=== Returns ===
 
* '''value''' (<code>number</code>)
 
== sql_rand ==
 
SQL RAND(): returns a random float in [0,1)
 
'''Allowed number of parameters:''' 0–0
 
<span id="parameters-31"></span>
=== Parameters ===
 
''This function has no parameters.''
 
<span id="returns-31"></span>
=== Returns ===
 
* '''value''' (<code>number</code>)
 
== parameterize_sql_select_literals ==
 
replaces safe literals in a top-level MySQL SELECT and returns normalized SQL, positional runtime bindings, and its stable shape hash
 
'''Allowed number of parameters:''' 1–1
 
<span id="parameters-32"></span>
=== Parameters ===
 
* '''query''' (<code>string</code>)
 
<span id="returns-32"></span>
=== Returns ===
 
* '''value''' (<code>list</code>)

Latest revision as of 11:59, 28 August 2026


Arithmetic / Logic

Generated from MemCP commit c42e19eba on 27 August 2026. See Full SCM API documentation.

The Arithmetic / Logic module provides the mathematical and logical foundation of MemCP Scheme and compiled SQL expressions. It includes:

  • Type predicates for integers, numbers, NULL/nil, booleans, and related runtime values;
  • Arithmetic such as addition, subtraction, multiplication, division, modulo, and numeric conversion;
  • Comparison and SQL truth including ordering, equality, NULL-aware predicates, and three-valued-logic helpers;
  • Mathematical functions for rounding, extrema, powers, logarithms, and aggregate reduction;
  • Bitwise and optimizer primitives used by generated query plans.

Functions intended only for generated plans remain documented because they are part of the runtime interface, but application code should prefer the corresponding SQL or ordinary Scheme operation where one exists.

int?

tells if the value is a integer

Allowed number of parameters: 1–1

Parameters

  • value (any): value

Returns

  • value (bool)

number?

tells if the value is a number

Allowed number of parameters: 1–1

Parameters

  • value (any): value

Returns

  • value (bool)

symbol?

tells if the value is a symbol

Allowed number of parameters: 1–1

Parameters

  • value (any): value

Returns

  • value (bool)

+

adds two or more numbers

Allowed number of parameters: 0–10000

Parameters

  • value... (number): values to add (variadic)

Returns

  • value (number)

sql_sum_reduce

adds two SQL SUM values while treating NULL as the empty aggregate identity

Allowed number of parameters: 2–2

Parameters

  • left (number|nil): partial sum
  • right (number|nil): next value

Returns

  • value (number|nil)

-

subtracts two or more numbers from the first one

Allowed number of parameters: 0–10000

Parameters

  • value... (number): values (variadic)

Returns

  • value (number)

sql_add_numeric_literals

adds two SQL numeric literals using their exact decimal spellings

Allowed number of parameters: 2–2

Parameters

  • a (number): left literal
  • b (number): right literal

Returns

  • value (number)

sql_sub_numeric_literals

subtracts two SQL numeric literals using their exact decimal spellings

Allowed number of parameters: 2–2

Parameters

  • a (number): left literal
  • b (number): right literal

Returns

  • value (number)

*

multiplies two or more numbers

Allowed number of parameters: 0–10000

Parameters

  • value... (number): values (variadic)

Returns

  • value (number)

/

divides two or more numbers from the first one

Allowed number of parameters: 0–10000

Parameters

  • value... (number): values (variadic)

Returns

  • value (number)

mod

returns the remainder of integer division (modulo)

Allowed number of parameters: 2–2

Parameters

  • a (number): dividend
  • b (number): divisor

Returns

  • value (number)

<=

compares two numbers or strings; returns nil if either value is nil

Allowed number of parameters: 2–2

Parameters

  • a (any): first value
  • b (any): second value

Returns

  • value (bool)

<

compares two numbers or strings; returns nil if either value is nil

Allowed number of parameters: 2–2

Parameters

  • a (any): first value
  • b (any): second value

Returns

  • value (bool)

>

compares two numbers or strings; returns nil if either value is nil

Allowed number of parameters: 2–2

Parameters

  • a (any): first value
  • b (any): second value

Returns

  • value (bool)

>=

compares two numbers or strings; returns nil if either value is nil

Allowed number of parameters: 2–2

Parameters

  • a (any): first value
  • b (any): second value

Returns

  • value (bool)

equal?

compares two values of the same type, (equal? nil nil) is true

Allowed number of parameters: 2–2

Parameters

  • a (any): first value
  • b (any): second value

Returns

  • value (bool)

equal??

performs a SQL compliant sloppy equality check on primitive values (number, int, string, bool. nil), strings are compared case insensitive, (equal? nil nil) is nil

Allowed number of parameters: 2–2

Parameters

  • a (any): first value
  • b (any): second value

Returns

  • value (bool)

sql_not

negates a SQL predicate while preserving nil as UNKNOWN

Allowed number of parameters: 1–1

Parameters

  • value (any): SQL predicate value

Returns

  • value (bool|nil)

equal_collate

performs SQL equality with a specified collation (e.g. *_ci case-insensitive, *_bin case-sensitive); returns nil if either arg is nil

Allowed number of parameters: 3–3

Parameters

  • a (any): left side
  • b (any): right side
  • collation (string): collation name

Returns

  • value (bool)

notequal_collate

performs SQL inequality with a specified collation; returns nil if either arg is nil

Allowed number of parameters: 3–3

Parameters

  • a (any): left side
  • b (any): right side
  • collation (string): collation name

Returns

  • value (bool)

!

negates the boolean value

Allowed number of parameters: 1–1

Parameters

  • value (bool): value

Returns

  • value (bool)

not

negates the boolean value

Allowed number of parameters: 1–1

Parameters

  • value (bool): value

Returns

  • value (bool)

nil?

returns true if value is nil

Allowed number of parameters: 1–1

Parameters

  • value (any): value

Returns

  • value (bool)

min

returns the smallest value

Allowed number of parameters: 0–10000

Parameters

  • value... (number|string): value (variadic)

Returns

  • value (number|string)

max

returns the highest value

Allowed number of parameters: 0–10000

Parameters

  • value... (number|string): value (variadic)

Returns

  • value (number|string)

floor

rounds the number down

Allowed number of parameters: 1–1

Parameters

  • value (number): value

Returns

  • value (number)

ceil

rounds the number up

Allowed number of parameters: 1–1

Parameters

  • value (number): value

Returns

  • value (number)

round

rounds the number

Allowed number of parameters: 1–1

Parameters

  • value (number): value

Returns

  • value (number)

sql_decimal_output

normalizes a DECIMAL-derived result to its declared output scale

Allowed number of parameters: 2–2

Parameters

  • value (number|nil): DECIMAL-derived value
  • scale (int): declared decimal scale

Returns

  • value (number|nil)

sql_abs

SQL ABS(): returns absolute value, NULL-safe

Allowed number of parameters: 1–1

Parameters

  • value (number): value

Returns

  • value (number)

sqrt

returns the square root of a number

Allowed number of parameters: 1–1

Parameters

  • value (number): value

Returns

  • value (number)

sql_rand

SQL RAND(): returns a random float in [0,1)

Allowed number of parameters: 0–0

Parameters

This function has no parameters.

Returns

  • value (number)

parameterize_sql_select_literals

replaces safe literals in a top-level MySQL SELECT and returns normalized SQL, positional runtime bindings, and its stable shape hash

Allowed number of parameters: 1–1

Parameters

  • query (string)

Returns

  • value (list)