Call a function: Difference between revisions

Content added Content deleted
(added a solution for Factor)
Line 969: Line 969:
// Partial application example
// Partial application example
let add2 = (+) 2</lang>
let add2 = (+) 2</lang>

=={{header|Factor}}==
* Calling a word with no arguments:
<lang Factor>
foo
</lang>

* Calling a word with a fixed number of arguments. This will pull as many objects as it needs from the stack. If there are not enough, it will result in a stack underflow.
<lang Factor>
foo
</lang>

* No special support for optional arguments.

* Variable arguments are achieved by defining a word that takes an integer, and operates on that many items at the top of the stack:
<lang Factor>
"a" "b" "c" 3 narray
</lang>

* The named arguments idiom is to define a tuple, set its slots, and pass it to a word:
<lang Factor>
<email>
"jack@aol.com" >>from
{ "jill@aol.com" } >>to
"Hello there" >>subject
body >>body
send-email
</lang>

* Factor lacks statements; everything is an expression.

* First-class context: this pushes a word to the stack. Use execute to evaluate.
<lang Factor>
\ foo
</lang>
Additionally, you can put words directly inside sequences and quotations:
<lang Factor>
{ foo } [ foo ]
</lang>

* Obtaining the return value, which will be placed on the stack:
<lang Factor>
foo
</lang>

* Returns true if the word is defined in the Factor VM as opposed to in a vocabulary:
<lang Factor>
\ foo primitive?
</lang>

* Factor makes no distinction between subroutines and functions. Presumably, a subroutine is just a word which puts nothing on the stack.

* By value or by reference is irrelevant; Factor is not applicative.

* Partial application is possible by use of curry. Here, the object 2 is curried into the left side of the quotation (anonymous function) [ - ]:
<lang Factor>
{ 1 2 3 } 2 [ - ] curry map .
! { -1 0 1 }
</lang>


=={{header|Forth}}==
=={{header|Forth}}==