factor/extra/infix/infix-docs.factor

91 lines
3.1 KiB
Factor
Raw Normal View History

! Copyright (C) 2009 Philipp Brüschweiler
! See http://factorcode.org/license.txt for BSD license.
2013-05-01 14:57:20 -04:00
USING: help.syntax help.markup math math.functions prettyprint locals sequences ;
2009-02-07 19:03:35 -05:00
IN: infix
2017-08-26 19:00:19 -04:00
HELP: \infix[[
{ $syntax "infix[[ ... ]]" }
2009-02-07 19:03:35 -05:00
{ $description "Parses the infix code inside the brackets, converts it to stack code and executes it." }
{ $examples
{ $example
"USING: infix prettyprint ;"
"IN: scratchpad"
2017-08-26 19:00:19 -04:00
"infix[[ 8+2*3 ]] ."
2009-02-07 19:03:35 -05:00
"14"
} $nl
2017-08-26 19:00:19 -04:00
{ $link postpone: \infix[[ } " isn't that useful by itself, as it can only access literal numbers and no variables. It is designed to be used together with locals; for example with " { $link postpone: \:: } " :"
2009-02-07 19:03:35 -05:00
{ $example
"USING: infix locals math.functions prettyprint ;"
"IN: scratchpad"
":: quadratic-equation ( a b c -- z- z+ )"
2017-08-26 19:00:19 -04:00
" infix[[ (-b-sqrt(b*b-4*a*c)) / (2*a) ]]"
" infix[[ (-b+sqrt(b*b-4*a*c)) / (2*a) ]] ;"
2009-02-07 19:03:35 -05:00
"1 0 -1 quadratic-equation . ."
"1.0\n-1.0"
}
} ;
ARTICLE: "infix" "Infix notation"
"The " { $vocab-link "infix" } " vocabulary implements support for infix notation in Factor source code."
{ $subsections
2017-08-26 19:00:19 -04:00
postpone: \infix[[
2017-08-26 18:52:34 -04:00
postpone: \INFIX::
}
"The usual infix math operators are supported:"
{ $list
{ $link + }
{ $link - }
{ $link * }
{ $link / }
2013-05-01 14:57:20 -04:00
{ { $snippet "**" } ", which is the infix operator for " { $link ^ } "." }
{ { $snippet "%" } ", which is the infix operator for " { $link mod } "." }
}
"The standard precedence rules apply: Grouping with parentheses before " { $snippet "*" } ", " { $snippet "/" } "and " { $snippet "%" } " before " { $snippet "+" } " and " { $snippet "-" } "."
{ $example
"USE: infix"
2017-08-26 19:00:19 -04:00
"infix[[ 5-40/10*2 ]] ."
"-3"
}
$nl
"You can call Factor words in infix expressions just as you would in C. There are some restrictions on which words are legal to use though:"
{ $list
"The word must return exactly one value."
"The word name must consist of the letters a-z, A-Z, _ or 0-9, and the first character can't be a number."
}
{ $example
"USING: infix locals math.functions ;"
":: binary_entropy ( p -- h )"
2017-08-26 19:00:19 -04:00
" infix[[ -(p*log(p) + (1-p)*log(1-p)) / log(2) ]] ;"
"infix[[ binary_entropy( sqrt(0.25) ) ]] ."
"1.0"
}
$nl
2013-05-01 14:57:20 -04:00
"You can access " { $vocab-link "sequences" } " inside infix expressions with the familiar " { $snippet "seq[index]" } " notation."
{ $example
2009-10-28 15:05:23 -04:00
"USING: arrays locals infix ;"
2017-08-26 19:00:19 -04:00
"let[ { 1 2 3 4 } :> myarr infix[[ myarr[4/2]*3 ]] ] ."
"9"
}
$nl
2013-05-01 14:57:20 -04:00
"You can create sub-" { $vocab-link "sequences" } " inside infix expressions using " { $snippet "seq[from:to]" } " notation."
{ $example
"USING: arrays locals infix ;"
2017-08-26 19:00:19 -04:00
"let[ \"foobar\" :> s infix[[ s[0:3] ]] ] ."
"\"foo\""
}
2013-05-01 14:57:20 -04:00
$nl
"Additionally, you can step through " { $vocab-link "sequences" } " with " { $snippet "seq[from:to:step]" } " notation."
{ $example
"USING: arrays locals infix ;"
2017-08-26 19:00:19 -04:00
"let[ \"reverse\" :> s infix[[ s[::-1] ]] ] ."
2013-05-01 14:57:20 -04:00
"\"esrever\""
}
{ $example
"USING: arrays locals infix ;"
2017-08-26 19:00:19 -04:00
"let[ \"0123456789\" :> s infix[[ s[::2] ]] ] ."
2013-05-01 14:57:20 -04:00
"\"02468\""
}
;
ABOUT: "infix"