IN: inference USING: generic interpreter kernel lists math namespaces sequences words ; : infer-shuffle-inputs ( shuffle node -- ) >r dup shuffle-in-d length swap shuffle-in-r length r> node-inputs ; : shuffle-stacks ( shuffle -- ) #! Shuffle simulated stacks. meta-d get meta-r get rot shuffle meta-r set meta-d set ; : infer-shuffle-outputs ( shuffle node -- ) >r dup shuffle-out-d length swap shuffle-out-r length r> node-outputs ; : infer-shuffle ( shuffle -- ) #shuffle 2dup infer-shuffle-inputs over shuffle-stacks tuck infer-shuffle-outputs node, ; : shuffle>effect ( shuffle -- effect ) dup shuffle-in-d [ drop object ] map swap shuffle-out-d [ drop object ] map 2list ; : define-shuffle ( word shuffle -- ) [ shuffle>effect "infer-effect" set-word-prop ] 2keep [ , \ infer-shuffle , ] [ ] make "infer" set-word-prop ; { { drop << shuffle f 1 0 { } { } >> } { 2drop << shuffle f 2 0 { } { } >> } { 3drop << shuffle f 3 0 { } { } >> } { dup << shuffle f 1 0 { 0 0 } { } >> } { 2dup << shuffle f 2 0 { 0 1 0 1 } { } >> } { 3dup << shuffle f 3 0 { 0 1 2 0 1 2 } { } >> } { rot << shuffle f 3 0 { 1 2 0 } { } >> } { -rot << shuffle f 3 0 { 2 0 1 } { } >> } { dupd << shuffle f 2 0 { 0 0 1 } { } >> } { swapd << shuffle f 3 0 { 1 0 2 } { } >> } { nip << shuffle f 2 0 { 1 } { } >> } { 2nip << shuffle f 3 0 { 2 } { } >> } { tuck << shuffle f 2 0 { 1 0 1 } { } >> } { over << shuffle f 2 0 { 0 1 0 } { } >> } { pick << shuffle f 3 0 { 0 1 2 0 } { } >> } { swap << shuffle f 2 0 { 1 0 } { } >> } { >r << shuffle f 1 0 { } { 0 } >> } { r> << shuffle f 0 1 { 0 } { } >> } } [ first2 define-shuffle ] each