...
 
Commits (20)
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
.export _channel_code .export _channel_code
.export EMPTY INT BOOL CHAR REAL FILE _STRING_ _ARRAY_ ARRAY .export EMPTY INT BOOL CHAR REAL REAL32 INT32 FILE _STRING_ _ARRAY_ ARRAY
.export _reserve _cycle_in_spine _hnf .export _reserve _cycle_in_spine _hnf
.export _type_error _match_error selector_m_error index_error .export _type_error _match_error selector_m_error index_error
.export _print_graph _eval_to_nf .export _print_graph _eval_to_nf
...@@ -37,10 +37,10 @@ ...@@ -37,10 +37,10 @@
.desc GRAPH _hnf _hnf 0 0 "" .desc GRAPH _hnf _hnf 0 0 ""
.desc _ARRAY_ _hnf _hnf 0 0 "_ARRAY_" .desc _ARRAY_ _hnf _hnf 0 0 "_ARRAY_"
.desc _STRING_ _hnf _hnf 0 0 "_STRING_" .desc _STRING_ _hnf _hnf 0 0 "_STRING_"
|.desc STRING _hnf _hnf 0 "STRING"
|.desc FILE _hnf _hnf 0 "FILE"
.desc REAL _hnf _hnf 0 0 "REAL" .desc REAL _hnf _hnf 0 0 "REAL"
.desc INT _hnf _hnf 0 0 "INT" .desc INT _hnf _hnf 0 0 "INT"
.desc REAL32 _hnf _hnf 0 0 "REAL32"
.desc INT32 _hnf _hnf 0 0 "INT32"
.desc BOOL _hnf _hnf 0 0 "BOOL" .desc BOOL _hnf _hnf 0 0 "BOOL"
.desc CHAR _hnf _hnf 0 0 "CHAR" .desc CHAR _hnf _hnf 0 0 "CHAR"
...@@ -248,16 +248,6 @@ ea_S.1 ...@@ -248,16 +248,6 @@ ea_S.1
jmp_eval_upd jmp_eval_upd
.pe .pe
.o 1 0
o_S.1
get_node_arity 0
pushI 1
push_arg_b 0
update_a 0 1
pop_a 1
.d 1 0
rtn
.descs d_S.2 n_S.2 _ 2 0 "_S.2" .descs d_S.2 n_S.2 _ 2 0 "_S.2"
.pb "_S.2" .pb "_S.2"
.n -1 d_S.2 ea_S.2 .n -1 d_S.2 ea_S.2
...@@ -309,21 +299,6 @@ ea_S.2_ ...@@ -309,21 +299,6 @@ ea_S.2_
jmp_eval_upd jmp_eval_upd
.pe .pe
.o 1 0
o_S.2
get_node_arity 0
eqI_b 2 0
jmp_false o_S.2_
pop_b 1
repl_arg 2 2
.d 1 0
rtn
o_S.2_
repl_arg 3 2
pop_b 1
.d 1 0
rtn
.descs d_S.3 n_S.3 _ 4 0 "_S.3" .descs d_S.3 n_S.3 _ 4 0 "_S.3"
.pb "_S.3" .pb "_S.3"
.n -1 d_S.3 ea_S.3 .n -1 d_S.3 ea_S.3
...@@ -360,17 +335,8 @@ ea_S.3 ...@@ -360,17 +335,8 @@ ea_S.3
jmp_eval_upd jmp_eval_upd
.pe .pe
.o 1 0
o_S.3
get_node_arity 0
pushI 3
push_arg_b 0
update_a 0 1
pop_a 1
.d 1 0
rtn
.descs d_S.4 n_S.4 _ 5 0 "_S.4" .descs d_S.4 n_S.4 _ 5 0 "_S.4"
.pb "_S.4"
.n -1 d_S.4 ea_S.4 .n -1 d_S.4 ea_S.4
.o 1 0 .o 1 0
n_S.4 n_S.4
...@@ -403,18 +369,10 @@ ea_S.4 ...@@ -403,18 +369,10 @@ ea_S.4
update_a 0 1 update_a 0 1
pop_a 1 pop_a 1
jmp_eval_upd jmp_eval_upd
.pe
.o 1 0
o_S.4
get_node_arity 0
pushI 4
push_arg_b 0
update_a 0 1
pop_a 1
.d 1 0
rtn
.descs d_S.5 n_S.5 _ 6 0 "_S.5" .descs d_S.5 n_S.5 _ 6 0 "_S.5"
.pb "_S.5"
.n -1 d_S.5 ea_S.5 .n -1 d_S.5 ea_S.5
.o 1 0 .o 1 0
n_S.5 n_S.5
...@@ -447,18 +405,10 @@ ea_S.5 ...@@ -447,18 +405,10 @@ ea_S.5
update_a 0 1 update_a 0 1
pop_a 1 pop_a 1
jmp_eval_upd jmp_eval_upd
.pe
.o 1 0
o_S.5
get_node_arity 0
pushI 5
push_arg_b 0
update_a 0 1
pop_a 1
.d 1 0
rtn
.descs d_S.6 n_S.6 _ 7 0 "_S.6" .descs d_S.6 n_S.6 _ 7 0 "_S.6"
.pb "_S.6"
.n -1 d_S.6 ea_S.6 .n -1 d_S.6 ea_S.6
.o 1 0 .o 1 0
n_S.6 n_S.6
...@@ -491,18 +441,7 @@ ea_S.6 ...@@ -491,18 +441,7 @@ ea_S.6
update_a 0 1 update_a 0 1
pop_a 1 pop_a 1
jmp_eval_upd jmp_eval_upd
.pe
.o 1 0
o_S.6
get_node_arity 0
pushI 6
push_arg_b 0
update_a 0 1
pop_a 1
.d 1 0
rtn
.desc d_Sr.1 n_Sr.1 o_Sr.1 1 0 "_Sr.1" .desc d_Sr.1 n_Sr.1 o_Sr.1 1 0 "_Sr.1"
...@@ -1415,33 +1354,31 @@ _print__array2 ...@@ -1415,33 +1354,31 @@ _print__array2
print_sc "{" print_sc "{"
push_b 0 eqI_b 0 0
eq_desc_b BOOL 0 jmp_true _print_array_a
jmp_true _print_bool_array
push_b 0 eqD_b BOOL 0
eq_desc_b INT 0 jmp_true _print_bool_array
eqD_b INT 0
jmp_true _print_int_array jmp_true _print_int_array
eqD_b REAL 0
push_b 0
eq_desc_b REAL 0
jmp_true _print_real_array jmp_true _print_real_array
eqD_b INT32 0
jmp_true _print_int32_array
eqD_b REAL32 0
jmp_true _print_real32_array
pop_b 1
pushI 0 pushI 0
push_a 0 push_a 0
push_arraysize _ 0 1 push_arraysize _ 0 1
jmp _print_record_array
push_b 2 _print_array_a
update_b 2 3
update_b 1 2
update_b 0 1
pop_b 1 pop_b 1
pushI 0 pushI 0
eqI push_a 0
jmp_false _print_record_array push_arraysize _ 0 1
jmp _print_array_lp2 jmp _print_array_lp2
.o 1 2 i i .o 1 2 i i
_print_array_lp1 _print_array_lp1
...@@ -1763,11 +1700,7 @@ _no_comma_3 ...@@ -1763,11 +1700,7 @@ _no_comma_3
push_a 0 push_a 0
select REAL 0 2 select REAL 0 2
create print_real
fillR_b 0 0
pop_b 2
print_symbol_sc 0
pop_a 1
push_b 1 push_b 1
incI incI
...@@ -1781,6 +1714,68 @@ _print_real_array_lp2 ...@@ -1781,6 +1714,68 @@ _print_real_array_lp2
pop_b 2 pop_b 2
print_sc "}" print_sc "}"
jmp _print_brackets jmp _print_brackets
_print_int32_array
pop_b 1
pushI 0
push_a 0
push_arraysize INT32 0 1
jmp _print_int32_array_lp2
.o 1 2 i i
_print_int32_array_lp1
eqI_b 0 1
jmp_true _no_comma_4
print_sc ","
_no_comma_4
push_b 1
push_a 0
select INT32 0 1
print_int
push_b 1
incI
update_b 0 2
pop_b 1
decI
_print_int32_array_lp2
eqI_b 0 0
jmp_false _print_int32_array_lp1
pop_a 1
pop_b 2
print_sc "}"
jmp _print_brackets
_print_real32_array
pop_b 1
push_a 0
pushI 0
push_arraysize REAL32 0 2
jmp _print_real32_array_lp2
.o 1 2 i i
_print_real32_array_lp1
eqI_b 0 1
jmp_true _no_comma_5
print_sc ","
_no_comma_5
push_b 1
push_a 0
select REAL32 0 2
print_real
push_b 1
incI
update_b 0 2
pop_b 1
decI
_print_real32_array_lp2
eqI_b 0 0
jmp_false _print_real32_array_lp1
pop_a 1
pop_b 2
print_sc "}"
jmp _print_brackets
_print_nil _print_nil
print_sc "[]" print_sc "[]"
...@@ -2197,33 +2192,31 @@ _eval__array ...@@ -2197,33 +2192,31 @@ _eval__array
_eval__array2 _eval__array2
push_r_args_b 0 0 2 2 1 push_r_args_b 0 0 2 2 1
push_b 0 eqI_b 0 0
eq_desc_b BOOL 0 jmp_true _eval_array_a
jmp_true _eval_bool_array
push_b 0 eqD_b BOOL 0
eq_desc_b INT 0 jmp_true _eval_bool_array
eqD_b INT 0
jmp_true _eval_int_array jmp_true _eval_int_array
eqD_b REAL 0
push_b 0
eq_desc_b REAL 0
jmp_true _eval_real_array jmp_true _eval_real_array
eqD_b INT32 0
jmp_true _eval_int32_array
eqD_b REAL32 0
jmp_true _eval_real32_array
pop_b 1
pushI 0 pushI 0
push_a 0 push_a 0
push_arraysize _ 0 1 push_arraysize _ 0 1
jmp _eval_record_array
push_b 2 _eval_array_a
update_b 2 3
update_b 1 2
update_b 0 1
pop_b 1 pop_b 1
pushI 0 pushI 0
eqI push_a 0
jmp_false _eval_record_array push_arraysize _ 0 1
jmp _eval_array_lp2 jmp _eval_array_lp2
.o 1 2 i i .o 1 2 i i
_eval_array_lp1 _eval_array_lp1
...@@ -2334,9 +2327,11 @@ _eval_char_array ...@@ -2334,9 +2327,11 @@ _eval_char_array
.d 0 0 .d 0 0
rtn rtn
_eval_real_array
_eval_bool_array _eval_bool_array
_eval_int_array _eval_int_array
_eval_real_array
_eval_int32_array
_eval_real32_array
pop_b 1 pop_b 1
pop_a 1 pop_a 1
.d 0 0 .d 0 0
......
...@@ -91,4 +91,7 @@ LeaveCriticalSection ...@@ -91,4 +91,7 @@ LeaveCriticalSection
WaitForMultipleObjects WaitForMultipleObjects
SetCurrentDirectoryA SetCurrentDirectoryA
GetLogicalDrives GetLogicalDrives
MoveFileA MoveFileA
\ No newline at end of file HeapFree
HeapReAlloc
SystemTimeToTzSpecificLocalTime
\ No newline at end of file
...@@ -90,3 +90,8 @@ GetShortPathNameA@12 ...@@ -90,3 +90,8 @@ GetShortPathNameA@12
UnmapViewOfFile@8 UnmapViewOfFile@8
OpenProcess@12 OpenProcess@12
InterlockedIncrement InterlockedIncrement
GetProcessHeap@0
HeapAlloc@12
HeapFree@12
HeapReAlloc@16
SystemTimeToTzSpecificLocalTime@12
\ No newline at end of file
# StdEnv-doc
This is an annotated version of [Clean][]'s [StdEnv][] library for use in
[Cloogle][].
All code is copyright © 1998 University of Nijmegen.
[Clean]: http://clean.cs.ru.nl
[Cloogle]: https://cloogle.org
[StdEnv]: https://svn.cs.ru.nl/repos/clean-libraries/trunk/Libraries/StdEnv/
system module StdBool system module StdBool
/**
* Class instances and basic functions for the Bool type.
*/
// **************************************************************************************** // ****************************************************************************************
// Concurrent Clean Standard Library Module Version 3.0 // Concurrent Clean Standard Library Module Version 3.0
// Copyright 2019 University of Nijmegen // Copyright 2019 University of Nijmegen
...@@ -16,8 +20,30 @@ instance fromBool {#Char} :: !Bool -> {#Char} :== code { .d 0 1 b ; jsr Bto ...@@ -16,8 +20,30 @@ instance fromBool {#Char} :: !Bool -> {#Char} :== code { .d 0 1 b ; jsr Bto
// Additional Logical Operators: // Additional Logical Operators:
/**
* Logical negation.
*
* @param The boolean to negate
* @result True if the parameter was False; False if True
*/
not :: !Bool -> Bool :== code { notB } not :: !Bool -> Bool :== code { notB }
// Not arg1
(||) infixr 2 :: !Bool Bool -> Bool // Conditional or of arg1 and arg2
(&&) infixr 3 :: !Bool Bool -> Bool // Conditional and of arg1 and arg2
/**
* Logical disjunction. The second parameter is not strict and will not be
* evaluated if the first parameter is True.
*
* @param First boolean
* @param Second boolean
* @result True iff at least one of the parameters is True
*/
(||) infixr 2 :: !Bool Bool -> Bool
/**
* Logical conjunction. The second parameter is not strict and will not be
* evaluated if the first parameter is False.
*
* @param First boolean
* @param Second boolean
* @result True iff both parameters are True
*/
(&&) infixr 3 :: !Bool Bool -> Bool
system module StdChar system module StdChar
/**
* Class instances and basic functions for the Char type.
*/
// **************************************************************************************** // ****************************************************************************************
// Concurrent Clean Standard Library Module Version 3.0 // Concurrent Clean Standard Library Module Version 3.0
// Copyright 2019 University of Nijmegen // Copyright 2019 University of Nijmegen
...@@ -24,20 +28,116 @@ instance fromChar {#Char} :: !Char -> {#Char} :== code { CtoAC } ...@@ -24,20 +28,116 @@ instance fromChar {#Char} :: !Char -> {#Char} :== code { CtoAC }
// Additional conversions: // Additional conversions:
digitToInt :: !Char -> Int // Convert Digit into Int /**
toUpper :: !Char -> Char // Convert Char into an uppercase Char * Converts a character from ['0'..'9'] to an integer.
toLower :: !Char -> Char // Convert Char into a lowercase Char *
* @param The character
* @result 0-9 if the character was from ['0'..'9'], otherwise another Int
*/
digitToInt :: !Char -> Int
/**
* Converts a character to uppercase.
*
* @param The character
* @result The same character, with bit 5 cleared
*/
toUpper :: !Char -> Char
/**
* Converts a character to lowercase.
*
* @param The character
* @result The same character, with bit 5 set
*/
toLower :: !Char -> Char
// Tests on Characters: // Tests on Characters:
isUpper :: !Char -> Bool // True if arg1 is an uppercase character /**
isLower :: !Char -> Bool // True if arg1 is a lowercase character * Check for uppercase
isAlpha :: !Char -> Bool // True if arg1 is a letter *
isAlphanum :: !Char -> Bool // True if arg1 is an alphanumerical character * @param The character
isDigit :: !Char -> Bool // True if arg1 is a digit * @result True iff the parameter is from ['A'..'Z']
isOctDigit :: !Char -> Bool // True if arg1 is a digit */
isHexDigit :: !Char -> Bool // True if arg1 is a digit isUpper :: !Char -> Bool
isSpace :: !Char -> Bool // True if arg1 is a space, tab etc
isControl :: !Char -> Bool // True if arg1 is a control character /**
isPrint :: !Char -> Bool // True if arg1 is a printable character * Check for lowercase
isAscii :: !Char -> Bool // True if arg1 is a 7 bit ASCII character *
* @param The character
* @result True iff the parameter is from ['a'..'z']
*/
isLower :: !Char -> Bool
/**
* Check for an alphabetic character
*
* @param The character
* @result True iff the parameter is from ['a'..'z'] ++ ['A'..'Z']
*/
isAlpha :: !Char -> Bool
/**
* Check for an alphabetic or numerical character
*
* @param The character
* @result True iff the parameter is from ['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9']
*/
isAlphanum :: !Char -> Bool
/**
* Check for a numerical character
*
* @param The character
* @result True iff the parameter is from ['0'..'9']
*/
isDigit :: !Char -> Bool
/**
* Check for an octal digit
*
* @param The character
* @result True iff the parameter is from ['0'..'7']
*/
isOctDigit :: !Char -> Bool
/**
* Check for a hexadecimal digit
*
* @param The character
* @result True iff the parameter is from ['0'..'9'] ++ ['a'..'f'] ++ ['A'..'F']
*/
isHexDigit :: !Char -> Bool
/**
* Check for whitespace
*
* @param The character
* @result True iff the parameter is one of ' ', '\t', '\n', '\r', '\f', '\v'
*/
isSpace :: !Char -> Bool
/**
* Check for an ASCII control character
*
* @param The character
* @result True iff the parameter is from ['\x00'..'\x1f'] ++ ['\x7f']
*/
isControl :: !Char -> Bool
/**
* Check for a printable ASCII character
*
* @param The character
* @result True iff the parameter is from [' '..'~']
*/
isPrint :: !Char -> Bool
/**
* Check for a 7-bit ASCII character
*
* @param The character
* @result True iff the integer value of the parameter is less than 128
*/
isAscii :: !Char -> Bool
definition module StdCharList definition module StdCharList
/**
* Basic functions for manipulating lists of characters.
*/
// **************************************************************************************** // ****************************************************************************************
// Concurrent Clean Standard Library Module Version 2.0 // Concurrent Clean Standard Library Module Version 2.0
// Copyright 1998 University of Nijmegen // Copyright 1998 University of Nijmegen
// **************************************************************************************** // ****************************************************************************************
cjustify :: !.Int ![.Char] -> .[Char] // Center [Char] in field with width arg1 /**
ljustify :: !.Int ![.Char] -> .[Char] // Left justify [Char] in field with width arg1 * Center-align a text with spaces, s.t. the right margin is 0 or 1 spaces
rjustify :: !.Int ![.Char] -> [Char] // Right justify [Char] in field with width arg1 * longer than the left margin.
*
* @param The minimum length of the result
* @param The text to center
* @result A list of max(|param 2|, param 1), with param 2 surrounded by spaces
*/
cjustify :: !.Int ![.Char] -> .[Char]
/**
* Left-align a text with spaces
*
* @param The minimum length of the result
* @param The text to align
* @result A list of max(|param 2|, param 1), with spaces appended to param 2
*/
ljustify :: !.Int ![.Char] -> .[Char]
/**
* Right-align a text with spaces
*
* @param The minimum length of the result
* @param The text to align
* @result A list of max(|param 2|, param 1), with spaces prepended to param 2
*/
rjustify :: !.Int ![.Char] -> [Char]
/**
* Concatenate a list of texts, interspersing it with newlines
*
* @param The texts
* @result All texts concatenated, with newlines in between
*/
flatlines :: ![[u:Char]] -> [u:Char]
flatlines :: ![[u:Char]] -> [u:Char] // Concatenate by adding newlines /**
mklines :: ![Char] -> [[Char]] // Split in lines removing newlines * Split a text on newlines
*
* @param The text
* @result A list of texts without newlines
*/
mklines :: ![Char] -> [[Char]]
spaces :: !.Int -> .[Char] // Make [Char] containing n space characters /**
* A list of a number of ' ' characters
*
* @param The number of characters
* @result A list of param 1 spaces
*/
spaces :: !.Int -> .[Char]
definition module StdClass definition module StdClass
/**
* Meta-classes with derived functions.
*/
// **************************************************************************************** // ****************************************************************************************
// Concurrent Clean Standard Library Module Version 2.0 // Concurrent Clean Standard Library Module Version 2.0
// Copyright 1998 University of Nijmegen // Copyright 1998 University of Nijmegen
...@@ -12,40 +16,73 @@ from StdBool import not ...@@ -12,40 +16,73 @@ from StdBool import not
// For the time-being, macro definitions are used for this purpose // For the time-being, macro definitions are used for this purpose
// This may cause misleading error messages in case of type errors // This may cause misleading error messages in case of type errors
//* Meta-class describing interval types with an absolute zero.
class PlusMin a | + , - , zero a class PlusMin a | + , - , zero a
//* Meta-class describing ratio types.
class MultDiv a | * , / , one a class MultDiv a | * , / , one a
//* Meta-class describing arithmetical types.
class Arith a | PlusMin , MultDiv , abs , sign , ~ a class Arith a | PlusMin , MultDiv , abs , sign , ~ a
//* Meta-class describing types that can be incremented and decremented.
class IncDec a | + , - , one , zero a class IncDec a | + , - , one , zero a
where where
//* Increment a value by one.
inc :: !a -> a | + , one a inc :: !a -> a | + , one a
inc x :== x + one inc x :== x + one
//* Decrement a value by one.
dec :: !a -> a | - , one a dec :: !a -> a | - , one a
dec x :== x - one dec x :== x - one
//* Meta-class describing types that can be enumerated.
class Enum a | < , IncDec a class Enum a | < , IncDec a
/**
* Equality.
* @var The type for which values can be equated
*/
class Eq a | == a class Eq a | == a
where where
/**
* Inequality.
* @result True iff the parameters are not equal
*/
(<>) infix 4 :: !a !a -> Bool | Eq a (<>) infix 4 :: !a !a -> Bool | Eq a
(<>) x y :== not (x == y) (<>) x y :== not (x == y)
/**
* Ordering.
* @var The type that can be ordered.
*/
class Ord a | < a class Ord a | < a
where where
/**
* Greater than.
* @result True iff the first value is strictly greater than the second value.
*/
(>) infix 4 :: !a !a -> Bool | Ord a (>) infix 4 :: !a !a -> Bool | Ord a
(>) x y :== y < x (>) x y :== y < x
/**
* Smaller than or equal to.
* @result True iff the first value is smaller than or equal to the second value.
*/
(<=) infix 4 :: !a !a -> Bool | Ord a (<=) infix 4 :: !a !a -> Bool | Ord a
(<=) x y :== not (y<x) (<=) x y :== not (y<x)
/**
* Greater than or equal to.
* @result True iff the first value is greater than or equal to the second value.
*/
(>=) infix 4 :: !a !a -> Bool | Ord a (>=) infix 4 :: !a !a -> Bool | Ord a
(>=) x y :== not (x<y) (>=) x y :== not (x<y)
//* The minimum of two values.
min::!a !a -> a | Ord a min::!a !a -> a | Ord a
min x y :== case (x<y) of True = x; _ = y min x y :== case (x<y) of True = x; _ = y
//* The maximum of two values.
max::!a !a -> a | Ord a max::!a !a -> a | Ord a
max x y :== case (x<y) of True = y; _ = x max x y :== case (x<y) of True = y; _ = x
definition module StdDebug definition module StdDebug
/**
* Functions that write intermediate results to stderr for debugging purposes.
*/
// ******************************************************** // ********************************************************
// Concurrent Clean Standard Library Module Version 2.0 // Concurrent Clean Standard Library Module Version 2.0
// Copyright 1998 University of Nijmegen // Copyright 1998 University of Nijmegen
...@@ -12,16 +16,48 @@ from StdString import instance toString {#Char},instance toString Int ...@@ -12,16 +16,48 @@ from StdString import instance toString {#Char},instance toString Int
// The following functions should only be used for debugging, // The following functions should only be used for debugging,
// because these functions have side effects // because these functions have side effects
trace :: !msg .a -> .a | toString msg // write toString msg to stderr /**
// before evaluating a * Write a message to stderr before returning a value.
special msg={#Char}; msg=Int *
trace_n :: !msg .a -> .a | toString msg // write toString msg and newline to stderr * @param The message to write to stderr
// before evaluating a * @param The value to return
special msg={#Char}; msg=Int * @result Param 2
*/
trace_t :: !msg -> Bool | toString msg // write toString msg to stderr trace :: !msg .a -> .a | toString msg special msg={#Char}; msg=Int
// result is True
special msg={#Char}; msg=Int /**
trace_tn :: !msg -> Bool | toString msg // write toString msg and newline to stderr * Write a message and a newline to stderr before returning a value.
// result is True *
special msg={#Char}; msg=Int * @param The message to write to stderr
* @param The value to return
* @result Param 2
*/
trace_n :: !msg .a -> .a | toString msg special msg={#Char}; msg=Int
/**
* Write a message to stderr and return True. This is useful in guards, for
* example:
*
* ```
* square x
* | trace_t x = x * x
* ```
*
* @param The message to write to stderr
* @result True
*/
trace_t :: !msg -> Bool | toString msg special msg={#Char}; msg=Int
/**
* Write a message and a newline to stderr and return True. This is useful in
* guards, for example:
*
* ```
* square x
* | trace_tn x = x * x
* ```
*
* @param The message to write to stderr
* @result True
*/
trace_tn :: !msg -> Bool | toString msg special msg={#Char}; msg=Int
definition module StdEnum definition module StdEnum
/**
* This module must be imported if dotdot expressions are used.
* Then, the following constructs can be used:
*
* - `[from .. ]` -> `{{_from}} from`
* - `[from .. to]` -> `{{_from_to}} from to`
* - `[from, then .. ]` -> `{{_from_then}} from then`
* - `[from, then .. to]` -> `{{_from_then_to}} from then to`
*/
// **************************************************************************************** // ****************************************************************************************
// Concurrent Clean Standard Library Module Version 2.0 // Concurrent Clean Standard Library Module Version 2.0
// Copyright 1998 University of Nijmegen // Copyright 1998 University of Nijmegen
// **************************************************************************************** // ****************************************************************************************
/*
This module must be imported if dotdot expressions are used
[from .. ] -> _from from
[from .. to] -> _from_to from to
[from, then .. ] -> _from_then from then
[from, then .. to] -> _from_then_to from then to
*/
import _SystemEnum import _SystemEnum
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
.desc REAL _hnf _hnf 0 0 "REAL" .desc REAL _hnf _hnf 0 0 "REAL"
.desc INT _hnf _hnf 0 0 "INT" .desc INT _hnf _hnf 0 0 "INT"
.desc REAL32 _hnf _hnf 0 0 "REAL32" .desc REAL32 _hnf _hnf 0 0 "REAL32"
.desc INT32 _hnf _hnf 0 0 "INT32" .desc INT32 _hnf _hnf 0 0 "INT32"
.desc BOOL _hnf _hnf 0 0 "BOOL" .desc BOOL _hnf _hnf 0 0 "BOOL"
.desc CHAR _hnf _hnf 0 0 "CHAR" .desc CHAR _hnf _hnf 0 0 "CHAR"
...@@ -248,16 +248,6 @@ ea_S.1 ...@@ -248,16 +248,6 @@ ea_S.1
jmp_eval_upd jmp_eval_upd
.pe .pe
.o 1 0
o_S.1
get_node_arity 0
pushI 1
push_arg_b 0
update_a 0 1
pop_a 1
.d 1 0
rtn
.descs d_S.2 n_S.2 _ 2 0 "_S.2" .descs d_S.2 n_S.2 _ 2 0 "_S.2"
.pb "_S.2" .pb "_S.2"
.n -1 d_S.2 ea_S.2 .n -1 d_S.2 ea_S.2
...@@ -309,21 +299,6 @@ ea_S.2_ ...@@ -309,21 +299,6 @@ ea_S.2_
jmp_eval_upd jmp_eval_upd
.pe .pe
.o 1 0
o_S.2
get_node_arity 0
eqI_b 2 0
jmp_false o_S.2_
pop_b 1
repl_arg 2 2
.d 1 0
rtn
o_S.2_
repl_arg 3 2
pop_b 1
.d 1 0
rtn
.descs d_S.3 n_S.3 _ 4 0 "_S.3" .descs d_S.3 n_S.3 _ 4 0 "_S.3"
.pb "_S.3" .pb "_S.3"
.n -1 d_S.3 ea_S.3 .n -1 d_S.3 ea_S.3
...@@ -360,17 +335,8 @@ ea_S.3 ...@@ -360,17 +335,8 @@ ea_S.3
jmp_eval_upd jmp_eval_upd
.pe .pe
.o 1 0
o_S.3
get_node_arity 0
pushI 3
push_arg_b 0
update_a 0 1
pop_a 1
.d 1 0
rtn
.descs d_S.4 n_S.4 _ 5 0 "_S.4" .descs d_S.4 n_S.4 _ 5 0 "_S.4"
.pb "_S.4"
.n -1 d_S.4 ea_S.4 .n -1 d_S.4 ea_S.4
.o 1 0 .o 1 0
n_S.4 n_S.4
...@@ -403,18 +369,10 @@ ea_S.4 ...@@ -403,18 +369,10 @@ ea_S.4
update_a 0 1 update_a 0 1
pop_a 1 pop_a 1
jmp_eval_upd jmp_eval_upd
.pe
.o 1 0
o_S.4
get_node_arity 0
pushI 4
push_arg_b 0
update_a 0 1
pop_a 1
.d 1 0
rtn
.descs d_S.5 n_S.5 _ 6 0 "_S.5" .descs d_S.5 n_S.5 _ 6 0 "_S.5"
.pb "_S.5"
.n -1 d_S.5 ea_S.5 .n -1 d_S.5 ea_S.5
.o 1 0 .o 1 0
n_S.5 n_S.5
...@@ -447,18 +405,10 @@ ea_S.5 ...@@ -447,18 +405,10 @@ ea_S.5
update_a 0 1 update_a 0 1
pop_a 1 pop_a 1
jmp_eval_upd jmp_eval_upd
.pe
.o 1 0
o_S.5
get_node_arity 0
pushI 5
push_arg_b 0
update_a 0 1
pop_a 1
.d 1 0
rtn
.descs d_S.6 n_S.6 _ 7 0 "_S.6" .descs d_S.6 n_S.6 _ 7 0 "_S.6"
.pb "_S.6"
.n -1 d_S.6 ea_S.6 .n -1 d_S.6 ea_S.6
.o 1 0 .o 1 0
n_S.6 n_S.6
...@@ -491,18 +441,7 @@ ea_S.6 ...@@ -491,18 +441,7 @@ ea_S.6
update_a 0 1 update_a 0 1
pop_a 1 pop_a 1
jmp_eval_upd jmp_eval_upd
.pe
.o 1 0
o_S.6
get_node_arity 0
pushI 6
push_arg_b 0
update_a 0 1
pop_a 1
.d 1 0
rtn
.desc d_Sr.1 n_Sr.1 o_Sr.1 1 0 "_Sr.1" .desc d_Sr.1 n_Sr.1 o_Sr.1 1 0 "_Sr.1"
...@@ -1391,33 +1330,31 @@ _print__array2 ...@@ -1391,33 +1330,31 @@ _print__array2
print_sc "{" print_sc "{"
push_b 0 eqI_b 0 0
eq_desc_b BOOL 0 jmp_true _print_array_a
jmp_true _print_bool_array
push_b 0 eqD_b BOOL 0
eq_desc_b INT 0 jmp_true _print_bool_array
eqD_b INT 0
jmp_true _print_int_array jmp_true _print_int_array
eqD_b REAL 0
push_b 0
eq_desc_b REAL 0
jmp_true _print_real_array jmp_true _print_real_array
eqD_b INT32 0
jmp_true _print_int32_array
eqD_b REAL32 0
jmp_true _print_real32_array
pop_b 1
pushI 0 pushI 0
push_a 0 push_a 0
push_arraysize _ 0 1 push_arraysize _ 0 1
jmp _print_record_array
push_b 2 _print_array_a
update_b 2 3
update_b 1 2
update_b 0 1
pop_b 1 pop_b 1
pushI 0 pushI 0
eqI push_a 0
jmp_false _print_record_array push_arraysize _ 0 1
jmp _print_array_lp2 jmp _print_array_lp2
.o 1 2 i i .o 1 2 i i
_print_array_lp1 _print_array_lp1
...@@ -1737,11 +1674,7 @@ _no_comma_3 ...@@ -1737,11 +1674,7 @@ _no_comma_3
push_a 0 push_a 0
select REAL 0 2 select REAL 0 2
create print_real
fillR_b 0 0
pop_b 1
print_symbol_sc 0
pop_a 1
push_b 1 push_b 1
incI incI
...@@ -1755,6 +1688,68 @@ _print_real_array_lp2 ...@@ -1755,6 +1688,68 @@ _print_real_array_lp2
pop_b 2 pop_b 2
print_sc "}" print_sc "}"
jmp _print_brackets jmp _print_brackets
_print_int32_array
pop_b 1
pushI 0
push_a 0
push_arraysize INT32 0 1
jmp _print_int32_array_lp2
.o 1 2 i i
_print_int32_array_lp1
eqI_b 0 1
jmp_true _no_comma_4
print_sc ","
_no_comma_4
push_b 1
push_a 0
select INT32 0 1
print_int
push_b 1
incI
update_b 0 2
pop_b 1
decI
_print_int32_array_lp2
eqI_b 0 0
jmp_false _print_int32_array_lp1
pop_a 1
pop_b 2
print_sc "}"
jmp _print_brackets
_print_real32_array
pop_b 1
push_a 0
pushI 0
push_arraysize REAL32 0 2
jmp _print_real32_array_lp2
.o 1 2 i i
_print_real32_array_lp1
eqI_b 0 1
jmp_true _no_comma_5
print_sc ","
_no_comma_5
push_b 1
push_a 0
select REAL32 0 2
print_real
push_b 1
incI
update_b 0 2
pop_b 1
decI
_print_real32_array_lp2
eqI_b 0 0
jmp_false _print_real32_array_lp1
pop_a 1
pop_b 2
print_sc "}"
jmp _print_brackets
_print_nil _print_nil
print_sc "[]" print_sc "[]"
...@@ -2169,33 +2164,31 @@ _eval__array ...@@ -2169,33 +2164,31 @@ _eval__array
_eval__array2 _eval__array2
push_r_args_b 0 0 2 2 1 push_r_args_b 0 0 2 2 1
push_b 0 eqI_b 0 0
eq_desc_b BOOL 0 jmp_true _eval_array_a
jmp_true _eval_bool_array
push_b 0 eqD_b BOOL 0
eq_desc_b INT 0 jmp_true _eval_bool_array
eqD_b INT 0
jmp_true _eval_int_array jmp_true _eval_int_array
eqD_b REAL 0
push_b 0
eq_desc_b REAL 0
jmp_true _eval_real_array jmp_true _eval_real_array
eqD_b INT32 0
jmp_true _eval_int32_array
eqD_b REAL32 0
jmp_true _eval_real32_array
pop_b 1
pushI 0 pushI 0
push_a 0 push_a 0
push_arraysize _ 0 1 push_arraysize _ 0 1
jmp _eval_record_array
push_b 2 _eval_array_a
update_b 2 3
update_b 1 2
update_b 0 1
pop_b 1 pop_b 1
pushI 0 pushI 0
eqI push_a 0
jmp_false _eval_record_array push_arraysize _ 0 1
jmp _eval_array_lp2 jmp _eval_array_lp2
.o 1 2 i i .o 1 2 i i
_eval_array_lp1 _eval_array_lp1
...@@ -2306,9 +2299,11 @@ _eval_char_array ...@@ -2306,9 +2299,11 @@ _eval_char_array
.d 0 0 .d 0 0
rtn rtn
_eval_real_array
_eval_bool_array _eval_bool_array
_eval_int_array _eval_int_array
_eval_real_array
_eval_int32_array
_eval_real32_array
pop_b 1 pop_b 1
pop_a 1 pop_a 1
.d 0 0 .d 0 0
......
definition module StdEnv definition module StdEnv
/**
* Clean's official Standard Environment library.
*/
// **************************************************************************************** // ****************************************************************************************
// Concurrent Clean Standard Library Module Version 3.0 // Concurrent Clean Standard Library Module Version 3.0
// Copyright 2018 Radboud University // Copyright 2018 Radboud University
......
This diff is collapsed.
definition module StdFunc definition module StdFunc
/**
* A number of general functions and functions dealing with functions.
*/
// **************************************************************************************** // ****************************************************************************************
// Concurrent Clean Standard Library Module Version 3.0 // Concurrent Clean Standard Library Module Version 3.0
// Copyright 2018 Radboud University // Copyright 2018 Radboud University
...@@ -9,15 +13,38 @@ import StdFunctions ...@@ -9,15 +13,38 @@ import StdFunctions
// Some handy functions for transforming unique states: // Some handy functions for transforming unique states:
seq :: ![.(.s -> .s)] .s -> .s // fn-1 (..(f1 (f0 x))..) /**
seqList :: ![St .s .a] .s -> ([.a],.s) // fn-1 (..(f1 (f0 x))..) * Iterate a list of state functions.
*
* @param The functions
* @param The initial state
* @result The final state
*/
seq :: ![.(.s -> .s)] .s -> .s
/**
* Iterate a list of state functions with result
*
* @param The functions
* @param The initial state
* @result A list of results from the state function and the final state
*/
seqList :: ![St .s .a] .s -> ([.a],.s)
//* A function that updates a state and produces a result.
:: St s a :== s -> *(a,s) :: St s a :== s -> *(a,s)
// monadic style: // monadic style:
(`bind`) infix 0 // :: w:(St .s .a) v:(.a -> .(St .s .b)) -> u:(St .s .b), [u <= v, u <= w] /**
* Monadic bind for the {{`St`}} type.
* @type w:(St .s .a) v:(.a -> .(St .s .b)) -> u:(St .s .b), [u <= v, u <= w]
*/
(`bind`) infix 0
(`bind`) f g :== \st0 -> let (r,st1) = f st0 in g r st1 (`bind`) f g :== \st0 -> let (r,st1) = f st0 in g r st1
// return :: u:a -> u:(St .s u:a) /**
* Monadic return for the {{`St`}} type.
* @type u:a -> u:(St .s u:a)
*/
return r :== \s -> (r,s) return r :== \s -> (r,s)
...@@ -5,16 +5,29 @@ definition module StdFunctions ...@@ -5,16 +5,29 @@ definition module StdFunctions
// Copyright 2018 Radboud University // Copyright 2018 Radboud University
// **************************************************************************************** // ****************************************************************************************
id :: !.a -> .a // identity function //* The identity function.
const :: !.a .b -> .a // constant function id :: !.a -> .a
//* Always returns the first argument.
const :: !.a .b -> .a
//flip :: !.(.a -> .(.b -> .c)) .b .a -> .c // Flip arguments /**
* Flips the arguments of a function. This is useful in function compositions.
* @type !.(.a -> .(.b -> .c)) .b .a -> .c
*/
flip f a b :== f b a flip f a b :== f b a
(o) infixr 9 // :: u:(.a -> .b) u:(.c -> .a) -> u:(.c -> .b) // Function composition /**
* Function composition: apply `f` after `g`.
* @type u:(.a -> .b) u:(.c -> .a) -> u:(.c -> .b)
*/
(o) infixr 9
(o) f g :== \ x -> f (g x) (o) f g :== \ x -> f (g x)
twice :: !(.a -> .a) .a -> .a // f (f x) //* Apply the function argument twice.
while :: !(a -> .Bool) (a -> a) a -> a // while (p x) f (f x) twice :: !(.a -> .a) .a -> .a
until :: !(a -> .Bool) (a -> a) a -> a // f (f x) until (p x) //* Apply the second argument as long as the first argument holds.
iter :: !Int (.a -> .a) .a -> .a // f (f..(f x)..) while :: !(a -> .Bool) (a -> a) a -> a
//* Apply the second argument until the first argument holds.
until :: !(a -> .Bool) (a -> a) a -> a
//* Apply a function a number of times.
iter :: !Int (.a -> .a) .a -> .a
...@@ -64,6 +64,11 @@ derive bimap RECORD ...@@ -64,6 +64,11 @@ derive bimap RECORD
derive bimap FIELD derive bimap FIELD
derive bimap (->) derive bimap (->)
generic binumap a b | binumap b a :: a -> b
derive binumap c
derive binumap (->)
// HACK: dictionaries for all generics. // HACK: dictionaries for all generics.
// It works since all generic classes have only one method and do not inherit // It works since all generic classes have only one method and do not inherit
// from other classes // from other classes
......
...@@ -21,6 +21,12 @@ bimap{|OBJECT|} fx _ (OBJECT x) = OBJECT (fx x) ...@@ -21,6 +21,12 @@ bimap{|OBJECT|} fx _ (OBJECT x) = OBJECT (fx x)
bimap{|(->)|} _ ba fr _ f = comp3 fr f ba bimap{|(->)|} _ ba fr _ f = comp3 fr f ba
generic binumap a b | binumap b a :: a ->b
binumap{|c|} x = x
binumap{|(->)|} _ ba fr _ f = comp3 fr f ba
comp3 :: !(.a -> .b) u:(.c -> .a) !(.d -> .c) -> u:(.d -> .b) comp3 :: !(.a -> .b) u:(.c -> .a) !(.d -> .c) -> u:(.d -> .b)
comp3 f g h comp3 f g h
| is_id f | is_id f
......
system module StdInt system module StdInt
/**
* Class instances and basic functions for the Int type.
*/
// **************************************************************************************** // ****************************************************************************************
// Concurrent Clean Standard Library Module Version 2.0 // Concurrent Clean Standard Library Module Version 2.0
// Copyright 1998 University of Nijmegen // Copyright 1998 University of Nijmegen
...@@ -49,17 +53,65 @@ instance lcm Int // Least common multiple ...@@ -49,17 +53,65 @@ instance lcm Int // Least common multiple
// Operators on Bits: // Operators on Bits:
/**
* Bitwise disjunction.
*
* @param The first integer
* @param The second integer
* @result An integer with exactly those bits set that at least one of the parameters has set
*/
(bitor) infixl 6 :: !Int !Int -> Int :== code { or% } (bitor) infixl 6 :: !Int !Int -> Int :== code { or% }
// Bitwise Or of arg1 and arg2
/**
* Bitwise conjunction.
*
* @param The first integer
* @param The second integer
* @result An integer with exactly those bits set that both of the parameters have set
*/
(bitand) infixl 6 :: !Int !Int -> Int :== code { and% } (bitand) infixl 6 :: !Int !Int -> Int :== code { and% }
// Bitwise And of arg1 and arg2
/**
* Bitwise exclusive disjunction.
*
* @param The first integer
* @param The second integer
* @result An integer with exactly those bits set that exactly one of the parameters has set
*/
(bitxor) infixl 6 :: !Int !Int -> Int :== code { xor% } (bitxor) infixl 6 :: !Int !Int -> Int :== code { xor% }
// Exclusive-Or arg1 with mask arg2
/**
* Shift an integer to the left.
*
* @param The integer to shift
* @param The number of places to shift
* @result The result of the bitshift
*/
(<<) infix 7 :: !Int !Int -> Int :== code { shiftl% } (<<) infix 7 :: !Int !Int -> Int :== code { shiftl% }
// Shift arg1 to the left arg2 bit places
/**
* Shift an integer to the right.
*
* @param The integer to shift
* @param The number of places to shift
* @result The result of the bitshift
*/
(>>) infix 7 :: !Int !Int -> Int :== code { shiftr% } (>>) infix 7 :: !Int !Int -> Int :== code { shiftr% }
// Shift arg1 to the right arg2 bit places
/**
* Bitwise logical negation.
*
* @param An integer
* @param The one's complement of the parameter
*/
bitnot :: !Int -> Int :== code { not% } bitnot :: !Int -> Int :== code { not% }
// One's complement of arg1
IF_INT_64_OR_32 int64 int32 :== int32; /**
* Compile-time macro to check for the integer length of the system.
*
* @type .a .a -> .a
* @param The value if the platform is 64-bit
* @param The value if the platform is 32-bit
* @result Either of the parameters, depending on the platform
*/
IF_INT_64_OR_32 int64 int32 :== int64;
This diff is collapsed.
...@@ -6,31 +6,43 @@ definition module StdMaybe ...@@ -6,31 +6,43 @@ definition module StdMaybe
from StdOverloaded import class ==(..); from StdOverloaded import class ==(..);
/**
* The Maybe type represents an optional value by providing a constructor
* for no value (`Nothing`) and a constructor for just a value (`Just`).
*/
:: Maybe x :: Maybe x
= Just x = Just x
| Nothing | Nothing
isJust :: !(Maybe .x) -> Bool // case @1 of (Just _) -> True; _ -> False //* `case @1 of ({{Just}} _) -> True; _ -> False`
isNothing :: !(Maybe .x) -> Bool // not o isJust isJust :: !(Maybe .x) -> Bool
fromJust :: !(Maybe .x) -> .x // \(Just x) -> x
// for possibly unique elements: //* `{{not}} {{o}} {{isJust}}`
isNothing :: !(Maybe .x) -> Bool
//* `\({{Just}} x) -> x`
fromJust :: !(Maybe .x) -> .x
//* {{`isJust`}} for a possibly unique value.
isJustU :: !u:(Maybe .x) -> (!Bool, !u:Maybe .x) isJustU :: !u:(Maybe .x) -> (!Bool, !u:Maybe .x)
//* {{`isNothing`}} for a possibly unique value.
isNothingU :: !u:(Maybe .x) -> (!Bool, !u:Maybe .x) isNothingU :: !u:(Maybe .x) -> (!Bool, !u:Maybe .x)
//* Apply a function on the value boxed in {{`Just`}}, or pass on {{`Nothing`}}.
mapMaybe :: .(.x -> .y) !(Maybe .x) -> Maybe .y mapMaybe :: .(.x -> .y) !(Maybe .x) -> Maybe .y
// mapMaybe f (Just x) = Just (f x)
// mapMaybe f Nothing = Nothing
instance == (Maybe x) | == x instance == (Maybe x) | == x
// Nothing==Nothing
// Just a ==Just b <= a==b
/**
* @result A list with no or one element.
*/
maybeToList :: !(Maybe .a) -> [.a]; maybeToList :: !(Maybe .a) -> [.a];
// returns list with no or one element
/**
* @result {{`Just`}} the head of the list or {{`Nothing`}} if it is empty.
*/
listToMaybe :: ![.a] -> .Maybe .a; listToMaybe :: ![.a] -> .Maybe .a;
// returns Just head of list if possible
//* `catMaybes ms = [m \\ {{Just}} m <- ms]`
catMaybes :: ![Maybe .a] -> .[.a]; catMaybes :: ![Maybe .a] -> .[.a];
// catMaybes ms = [ m \\ Just m <- ms ]
system module StdMisc system module StdMisc
/**
* Miscellaneous functions.
*/
// **************************************************************************************** // ****************************************************************************************
// Concurrent Clean Standard Library Module Version 3.0 // Concurrent Clean Standard Library Module Version 3.0
// Copyright 2019 University of Nijmegen // Copyright 2019 University of Nijmegen
// **************************************************************************************** // ****************************************************************************************
/**
* Print a message and abort the program.
*
* @param The message to print
* @result There is no result; the program will terminate
*/
abort :: !{#Char} -> .a :== code { .d 1 0 ; jsr print_string_ ; .o 0 0 ; halt } abort :: !{#Char} -> .a :== code { .d 1 0 ; jsr print_string_ ; .o 0 0 ; halt }
// stop reduction and print argument
undef :: .a // fatal error, stop reduction. /**
* The undefined value.
*
* @result An attempt to evaluate the result will yield a runtime error.
*/
undef :: .a
definition module StdOrdList definition module StdOrdList
/**
* Functions to work with lists of elements for which an ordering exists.
*/
// **************************************************************************************** // ****************************************************************************************
// Concurrent Clean Standard Library Module Version 2.0 // Concurrent Clean Standard Library Module Version 2.0
// Copyright 1998 University of Nijmegen // Copyright 1998 University of Nijmegen
...@@ -7,29 +11,53 @@ definition module StdOrdList ...@@ -7,29 +11,53 @@ definition module StdOrdList
import StdClass import StdClass
sort :: !u:[a] -> u:[a] | Ord a // Sort the list (mergesort) //* Sort a list (mergesort).
sort :: !u:[a] -> u:[a] | Ord a
special special
a = Char a = Char
a = Int a = Int
a = Real a = Real
sortBy :: (a a -> Bool) !u:[a] -> u:[a] // Sort the list, arg1 is < function
merge :: !u:[a] !v:[a] -> w:[a] /**
| Ord a,[u v <= w] // Merge two sorted lists giving a sorted list * Sort a list using a custom ordering.
* @param The custom {{`<`}} function
*/
sortBy :: (a a -> Bool) !u:[a] -> u:[a]
//* Merge two sorted lists.
merge :: !u:[a] !v:[a] -> w:[a] | Ord a,[u v <= w]
special special
a = Char a = Char
a = Int a = Int
a = Real a = Real
mergeBy :: (a a -> Bool) !u:[a] !v:[a] -> w:[a] // Merge two sorted lists giving a sorted list
,[u v <= w] // arg1 is < function /**
maxList :: !.[a] -> a | Ord a // Maximum element of list * Merge two sorted lists using a custom ordering.
* @param The custom {{`<`}} function
*/
mergeBy :: (a a -> Bool) !u:[a] !v:[a] -> w:[a],[u v <= w]
//* The maximum element of a list.
maxList :: !.[a] -> a | Ord a
special special
a = Char a = Char
a = Int a = Int
a = Real a = Real
maxListBy :: (a a -> Bool) !.[a] -> a // Maximum element of list, arg1 is < function
minList :: !.[a] -> a | Ord a // Minimum element of list /**
* The maximum element of a list using a custom ordering.
* @param The custom {{`<`}} function
*/
maxListBy :: (a a -> Bool) !.[a] -> a
//* The minimum element of a list.
minList :: !.[a] -> a | Ord a
special special
a = Char a = Char
a = Int a = Int
a = Real a = Real