92 lines
2.6 KiB
Text
92 lines
2.6 KiB
Text
[ [] $ "" rot
|
|
sort$ witheach
|
|
[ tuck != if
|
|
[ dup dip
|
|
[ nested join ] ] ]
|
|
drop ] is -duplicates ( { --> { )
|
|
|
|
[ [] $ "" rot
|
|
sort$ witheach
|
|
[ tuck = if
|
|
[ nested join
|
|
$ "" ] ]
|
|
drop -duplicates ] is duplicates ( { --> { )
|
|
|
|
|
|
[ [] $ "" rot
|
|
sort$ witheach
|
|
[ tuck != iff
|
|
[ dup dip [ nested join ] ]
|
|
else
|
|
[ dip [ -1 pluck ]
|
|
over != if
|
|
[ nested join $ "" ] ] ]
|
|
drop ] is --duplicates ( { --> { )
|
|
|
|
[ [] swap
|
|
[ trim
|
|
dup $ "" = if
|
|
[ $ '"set{" without "}set"'
|
|
message put bail ]
|
|
nextword
|
|
dup $ "}set" != while
|
|
nested rot join swap
|
|
again ]
|
|
drop swap
|
|
-duplicates
|
|
' [ ' ] swap nested join
|
|
swap dip [ nested join ] ] builds set{ ( [ $ --> [ $ )
|
|
|
|
[ -duplicates
|
|
say "{ "
|
|
witheach [ echo$ sp ]
|
|
say "}" ] is echoset ( { --> { )
|
|
|
|
[ join duplicates ] is intersection ( { { --> { )
|
|
|
|
[ join -duplicates ] is union ( { { --> { )
|
|
|
|
[ join --duplicates ] is symmdiff ( { { --> { )
|
|
|
|
[ over intersection symmdiff ] is difference ( { { --> { )
|
|
|
|
[ over intersection = ] is subset ( { { --> b )
|
|
|
|
[ dip nested subset ] is element ( $ { --> b )
|
|
|
|
[ 2dup = iff
|
|
[ 2drop false ]
|
|
else subset ] is propersubset ( { { --> b )
|
|
|
|
( ------------------------------ demo ------------------------------ )
|
|
|
|
set{ apple peach pear melon
|
|
apricot banana orange }set is fruits ( --> { )
|
|
|
|
set{ red orange green blue
|
|
purple apricot peach }set is colours ( --> { )
|
|
|
|
fruits dup echoset say " are fruits" cr
|
|
|
|
colours dup echoset say " are colours" cr
|
|
|
|
2dup intersection echoset say " are both fruits and colours" cr
|
|
|
|
2dup union echoset say " are fruits or colours" cr
|
|
|
|
2dup symmdiff echoset say " are fruits or colours but not both" cr
|
|
|
|
difference echoset say " are fruits that are not colours" cr
|
|
|
|
set{ red green blue }set dup echoset say " are"
|
|
colours subset not if [ say " not" ] say " all colours" cr
|
|
|
|
say "fruits and colours are" fruits colours = not if [ say " not" ]
|
|
say " exactly the same" cr
|
|
|
|
$ "orange" dup echo$ say " is"
|
|
fruits element not if [ say " not" ] say " a fruit" cr
|
|
|
|
set{ orange }set dup echoset say " is"
|
|
fruits propersubset dup if [ say " not" ] say " the only fruit"
|
|
not if [ say " or not a fruit" ] cr
|