Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
|
|
@ -0,0 +1,69 @@
|
|||
Class maybe {
|
||||
private:
|
||||
variant [val]="none"
|
||||
boolean haveValue
|
||||
public:
|
||||
property val {
|
||||
value // val return the [val] value
|
||||
}
|
||||
function bind(f) {
|
||||
m=This // we can read private because bind is function of same class as m
|
||||
if m.haveValue Then m.[val]=f(m.[val])
|
||||
=m // copy (not pointer)
|
||||
}
|
||||
Operator "=" (z as maybe) {
|
||||
if z.havevalue xor .havevalue then
|
||||
push false
|
||||
else
|
||||
Push z.[val]=.[val]
|
||||
end if
|
||||
}
|
||||
Function unit() {
|
||||
variant k
|
||||
if match("G") then // so we can read maybe class
|
||||
read g as maybe // fail if not maybe class
|
||||
if g.havevalue then push g.val
|
||||
end if
|
||||
Read ? k
|
||||
m=This
|
||||
if not type$(k)="Empty" then
|
||||
integer v=k ' fail if k can't convert to integer
|
||||
m.[val]=v
|
||||
m.haveValue=true
|
||||
else // so now we can produce "none" from an object which isn't "none"
|
||||
m.[val]="none"
|
||||
m.haveValue=false
|
||||
end if
|
||||
=m // copy (not pointer)
|
||||
}
|
||||
class:
|
||||
// after class: all are temporary for the constuction phase
|
||||
// module with class name is the contructor
|
||||
// the object constracted before enter this module
|
||||
// but we can change it. So we return a new one.
|
||||
module maybe {
|
||||
// so the constructor is the same as the .unit
|
||||
// ![] pick argument list and place to unit()
|
||||
// optionally we can skip the call if we have empty argument list
|
||||
if not empty then
|
||||
this=.unit(![])
|
||||
end if
|
||||
}
|
||||
}
|
||||
none=maybe()
|
||||
decrement =lambda (x as integer)->x-1%
|
||||
triple =lambda (x as integer)->x*3%
|
||||
variant emptyvariant
|
||||
// 3 and 4 are double, 5 is integer type
|
||||
SetA=(3,4,none,5%, emptyvariant, none.unit())
|
||||
k=each(SetA)
|
||||
While K
|
||||
m1=none.unit(array(k)) // pick element k^
|
||||
m2=m1.bind(decrement).bind(triple)
|
||||
m3=maybe(m2)
|
||||
Print m1.val+" -> "+m2.val, m3=m2, m3.val
|
||||
End While
|
||||
Try ok {
|
||||
m5=maybe("Hello")
|
||||
}
|
||||
Print not ok // true , "Hello" not accepted
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
Class maybe {
|
||||
private:
|
||||
variant [val]="none"
|
||||
boolean haveValue
|
||||
public:
|
||||
property val {
|
||||
value // val return the [val] value
|
||||
}
|
||||
function bind(f) {
|
||||
m=This // we can read private because bind is function of same class as m
|
||||
if m.haveValue Then m.[val]=f(m.[val])
|
||||
->(m) // pointer
|
||||
}
|
||||
Operator "=" (z as maybe) {
|
||||
if z.havevalue xor .havevalue then
|
||||
push false
|
||||
else
|
||||
Push z.[val]=.[val]
|
||||
end if
|
||||
}
|
||||
Function unit() {
|
||||
variant k
|
||||
if match("G") then // so we can read maybe class
|
||||
read g as maybe // fail if not maybe class
|
||||
if g.havevalue then push g.val
|
||||
end if
|
||||
Read ? k
|
||||
m=This
|
||||
if not type$(k)="Empty" then
|
||||
integer v=k ' fail if k can't convert to integer
|
||||
m.[val]=v
|
||||
m.haveValue=true
|
||||
else // so now we can produce "none" from an object which isn't "none"
|
||||
m.[val]="none"
|
||||
m.haveValue=false
|
||||
end if
|
||||
->(m) // pointer
|
||||
}
|
||||
class:
|
||||
module maybe {
|
||||
if not empty then
|
||||
this=.unit(![])
|
||||
end if
|
||||
}
|
||||
}
|
||||
none->maybe()
|
||||
decrement =lambda (x as integer)->x-1%
|
||||
triple =lambda (x as integer)->x*3%
|
||||
variant emptyvariant
|
||||
SetA=(3,4,none,5%, emptyvariant, none=>unit())
|
||||
k=each(SetA)
|
||||
document doc$
|
||||
While k
|
||||
m1=none=>unit(array(k)) // pick element k^
|
||||
m2=m1=>bind(decrement)=>bind(triple)
|
||||
m3=maybe(m2)
|
||||
doc$=m1=>val+" -> "+m2=>val+" m2=m3 -> "+if$(m2=m3->"True", "False")+{
|
||||
}
|
||||
End While
|
||||
Try ok {
|
||||
m5=maybe("Hello")
|
||||
}
|
||||
Doc$= (not ok)+{
|
||||
} // true , "Hello" not accepted
|
||||
report doc$
|
||||
clipboard doc$
|
||||
Loading…
Add table
Add a link
Reference in a new issue