]> gitweb.factorcode.org Git - factor.git/commitdiff
Define reciprocal inverses with "define-dual"
authorSamuel Tardieu <sam@rfc1149.net>
Tue, 13 Jan 2009 15:39:34 +0000 (16:39 +0100)
committerSamuel Tardieu <sam@rfc1149.net>
Tue, 13 Jan 2009 15:45:08 +0000 (16:45 +0100)
extra/inverse/inverse-docs.factor
extra/inverse/inverse-tests.factor
extra/inverse/inverse.factor

index 8204f7174c109c00e3832b55cdfaa4fd34607ab9..c2615fc4112e165ee30516685a43a6696245b2ef 100644 (file)
@@ -14,7 +14,12 @@ HELP: undo
 HELP: define-inverse
 { $values { "word" "a word" } { "quot" "the inverse" } }
 { $description "Defines the inverse of a given word, taking no arguments from the quotation, only the stack." }
-{ $see-also define-pop-inverse } ;
+{ $see-also define-dual define-pop-inverse } ;
+
+HELP: define-dual
+{ $values { "word1" "a word" } { "word2" "a word" } }
+{ $description "Defines the inverse of each word as being the other one." }
+{ $see-also define-inverse } ;
 
 HELP: define-pop-inverse
 { $values { "word" "a word" } { "n" "number of arguments to be taken from the inverted quotation" } { "quot" "a quotation" } }
index 5e662ed78f28b7373ab471453839300aef2f881e..3dce620857860f544acf644c8415fcba555eff15 100644 (file)
@@ -75,3 +75,6 @@ C: <nil> nil
 [ { 3 } ] [ { 1 2 3 } [ { 1 2 } prepend ] undo ] unit-test
 [ { 1 2 3 } [ { 1 2 } append ] undo ] must-fail
 [ { 1 2 3 } [ { 2 3 } prepend ] undo ] must-fail
+
+[ [ sq ] ] [ [ sqrt ] [undo] ] unit-test
+[ [ sqrt ] ] [ [ sq ] [undo] ] unit-test
index b9e07881920cd6a9bf68a3673e78643b9a679afd..ec4df1ba693226971d3ea9140d24c2b6c3a11965 100755 (executable)
@@ -20,6 +20,9 @@ M: fail summary drop "Matching failed" ;
 
 : define-inverse ( word quot -- ) "inverse" set-word-prop ;
 
+: define-dual ( word1 word2 -- )
+    2dup swap [ 1quotation define-inverse ] 2bi@ ;
+
 : define-math-inverse ( word quot1 quot2 -- )
     pick 1quotation 3array "math-inverse" set-word-prop ;
 
@@ -139,17 +142,14 @@ MACRO: undo ( quot -- ) [undo] ;
 \ not [ not ] define-inverse
 \ >boolean [ { t f } memq? assure ] define-inverse
 
-\ tuple>array [ >tuple ] define-inverse
-\ >tuple [ tuple>array ] define-inverse
+\ tuple>array \ >tuple define-dual
 \ reverse [ reverse ] define-inverse
 
 \ undo 1 [ [ call ] curry ] define-pop-inverse
 \ map 1 [ [undo] [ over sequence? assure map ] curry ] define-pop-inverse
 
-\ exp [ log ] define-inverse
-\ log [ exp ] define-inverse
-\ sq [ sqrt ] define-inverse
-\ sqrt [ sq ] define-inverse
+\ exp \ log define-dual
+\ sq \ sqrt define-dual
 
 ERROR: missing-literal ;
 
@@ -203,8 +203,7 @@ DEFER: _
 \ first3 [ 3array ] define-inverse
 \ first4 [ 4array ] define-inverse
 
-\ prefix [ unclip ] define-inverse
-\ unclip [ prefix ] define-inverse
+\ prefix \ unclip define-dual
 \ suffix [ dup but-last swap peek ] define-inverse
 
 \ append 1 [ [ ?tail assure ] curry ] define-pop-inverse