Variables: Difference between revisions

From Rosetta Code
Content added Content deleted
Line 38: Line 38:


To declare an initialized string that won't be changed the following declaration may be used:
To declare an initialized string that won't be changed the following declaration may be used:
<lang c>char * mytext = "The C Language";</lang>
<lang c>const char * mytext = "The C Language";</lang>
There are more rules regarding arrays, variables containing pointers, dynamic allocation,
There are more rules regarding arrays, variables containing pointers, dynamic allocation,
and initialization that are to extensive to cover here.
and initialization that are to extensive to cover here.

Revision as of 09:43, 31 January 2010

Task
Variables
You are encouraged to solve this task according to the task description, using any language you may know.

Demonstrate the language's local variable declaration, initialization, assignment, etc. facilities.

Ada

<lang ada>declare

  X : String := "Hello"; -- Create and initialize a local variable
  Y : Integer; -- Create an uninitialized variable
  Z : Integer renames Y: -- Rename Y (creates a view)

begin

  Y := 1; -- Assign variable

end; -- End of the scope</lang>

AutoHotkey

<lang autohotkey>x = hello  ; assign verbatim as a string z := 3 + 4  ; assign an expression if !y  ; uninitialized variables are assumed to be 0 or "" (blank string) Msgbox %x%  ; variable dereferencing is done by surrounding '%' signs fx() { local x  ; variable default scope in a function is local anyways global y  ; static z=4  ; initialized once, then value is remembered between function calls }</lang>

C

Local variables are generally called auto variables in C. Varibles must be declared before use. In traditional C, varibles must be declared at the front of a block. The declaration of a variable, without assigning a value takes the form <typename> <variablename>; <lang c>int j;</lang> Some common types are: char, short, int, long, float, double and unsigned.

Multiple variables may be defined in a single statement as follows: <lang c>double double1, double2, double3;</lang> It is possible to initialize variables with expressions having known values when they are defined. The syntax follows the form <typename> <variablename> = <initializing expression>; <lang c>short b1 = 2500; long elwood = 3*BSIZE, jake = BSIZE -2;</lang> Strings in C are arrays of char terminated by a 0 or NULL character. To declare space for a string of up to 20 characters, the following declaration is used. <lang c>char mystring[21];</lang> The extra length leaves room for the terminating 0.

To declare an initialized string that won't be changed the following declaration may be used: <lang c>const char * mytext = "The C Language";</lang> There are more rules regarding arrays, variables containing pointers, dynamic allocation, and initialization that are to extensive to cover here.

E

E is an impure, lexically scoped language. Variables must be defined before use (they are not created on assignment). Definition of variables is a special case of pattern matching.

An identifier occurring in a pattern is a simple non-assignable variable. The def operator is usually used to define local variables:

<lang e>def x := 1 x + x # returns 2</lang>

Assignment

The pattern var x makes x an assignable variable, and := is the assignment operator.

<lang e>def var x := 1 x := 2 x # returns 2</lang>

(As a shorthand, var x := ... is equivalent to def var x := ....)

There are update versions of the assignment operator, in the traditional C style (+=, -=, |=, etc.), but also permitting any verb (method name) to be used:

<lang e>def var x := 1 x += 1 # equivalent to x := x + 1, or x := x.add(1) x # returns 2

def var list := ["x"] list with= "y" # equivalent to list := list.with("y") list # returns ["x", "y"]</lang>

Patterns

Since variable definition is part of pattern matching, a list's elements may be distributed into a set of variables:

<lang e>def [hair, eyes, var shirt, var pants] := ["black", "brown", "plaid", "jeans"]</lang>

However, assignment to a list as in Perl or Python is not currently supported.

<lang e>[shirt, pants] := ["white", "black"] # This does not do anything useful.</lang>

Scoping

In E, a variable is visible from the point of its definition until the end of the enclosing block. Variables can even be defined inside expressions (actually, E has no statement/expression distinction):

<lang e>def list := [def x := timer.now(), x] # two copies of the current time list[0] == x # x is still visible here; returns true</lang>

Slots

The difference between assignable and non-assignable variables is defined in terms of primitive operations on non-primitive slot objects. Slots can also be employed by programmers for effects such as variables which have an effect when assigned (e.g. backgroundColor := red) or automatically change their values over time, but that is beyond the scope of this task. For example, it is possible to transfer a variable between scopes by referring to its slot:

<lang e>def makeSum() {

 var a := 0
 var b := 0
 return [&a, &b, fn { a + b }]

}

def [&x, &y, sum] := makeSum() x := 3 y := 4 sum() # returns 7</lang>

As suggested by the & syntax, the use of slots is somewhat analogous in effect to C pointers or C++ references, allowing the passing of locations and not their values, and "pass-by-reference" or "out" parameters:

<lang e>def getUniqueId(&counter) {

 counter += 1
 return counter

}

var idc := 0 getUniqueId(&idc) # returns 1 getUniqueId(&idc) # returns 2</lang>

Forth

Historically, Forth has preferred open access to the parameter stack over named local variables. The 1994 standard however added a cell-sized local variable facility and syntax. The semantics are similar to VALUEs: locals are initialized from stack contents at declaration, the name retrieves the value, and TO sets the value of the local name parsed at compile time ("value TO name"). <lang forth>: hypot ( a b -- a^2 + b^2 )

 LOCALS| b a |            \ note: reverse order from the conventional stack comment
 b b * a a * + ;</lang>
Works with: GNU Forth

Modern Forth implementations often extend this facility in several ways, both for more convenient declaration syntax and to be more compatible with foreign function interfaces. Curly braces are used to replace the conventional stack comment with a similar looking local variable declaration. <lang forth>: hypot { a b -- a^2 + b^2 } \ text between "--" and "}" remains commentary

 a a * b b * + ;</lang>

Modern systems may also allow different local data types than just integer cells. <lang forth>: length { F: a F: b F: c -- len } \ floating point locals

 a a F* b b F* F+ c c F* F+ FSQRT ;</lang>

Haskell

You can define a variable at the top (module) level or in a where, let, or do construct.

<lang haskell>foobar = 15

f x = x + foobar

 where foobar = 15

f x = let foobar = 15

     in  x + foobar

f x = do

   let foobar = 15
   return $ x + foobar</lang>

One particular feature of do notation looks like assignment, but actually, it's just syntactic sugar for the >>= operator and a unary lambda.

<lang haskell>main = do

   s <- getLine
   print (s, s)

-- The above is equivalent to:

main = getLine >>= \s -> print (s, s)</lang>

Pattern matching allows for multiple definitions of the same variable, in which case each call uses the first applicable definition.

<lang haskell>funkshun True x = x + 1 funkshun False x = x - 1

foobar = funkshun True 5 + funkshun False 5 -- 6 + 4</lang>

case expressions let you do pattern-matching on an arbitrary expression, and hence provide yet another way to define a variable.

<lang haskell>funkshun m = case foo m of

   [a, b]           -> a - b
   a : b : c : rest -> a + b - c + sum rest
   a                -> sum a</lang>

Guards are as a kind of syntactic sugar for if-else ladders.

<lang haskell>signum x | x > 0 = 1

        | x < 0     = -1
        | otherwise =  0</lang>

A defintion can be accompanied by a type signature, which can request a less general type than the compiler would've chosen on its own. (Because of the monomorphism restriction, there are also some cases where a type signature can request a more general type than the default.) Type signatures are also useful even when they make no changes, as a kind of documentation.

<lang haskell>dotProduct :: [Int] -> [Int] -> Int dotProduct ns ms = sum $ zipWith (+) ns ms -- Without the type signature, dotProduct would -- have a more general type.

foobar :: Num a => a foobar = 15 -- Without the type signature, the monomorphism -- restriction would cause foobar to have a less -- general type.</lang>

Since Haskell is purely functional, most variables are immutable. It's possible to create mutable variables in an appropriate monad. The exact semantics of such variables largely depend on the monad. For example, STRefs must be explicitly initialized and passed between scopes, whereas the implicit state of a State monad is always accessible via the get function.

J

<lang j>val=. 0</lang>

J has two assignment operators. The =. operator declares, initializes, assigns, etc. a local variable.

It is possible and not uncommon to write an entire J application without using any variables (J has a functional, "point free" style of coding known as tacit).

JavaScript

Information lifted from Stack Overflow (credit to krosenvold and triptych)

Javascript uses scope chains to establish the scope for a given function. There is typically one global scope, and each function defined has its own nested scope. Any function defined within another function has a local scope which is linked to the outer function. It's always the position in the source that defines the scope.

An element in the scope chain is basically a Map with a pointer to it's parent scope.

When resolving a variable, javascript starts at the innermost scope and searches outwards.

<lang javascript>// a globally-scoped variable

var a=1;

// global scope function one(){

   alert(a); 

}

// local scope function two(a){

   alert(a);

}

// local scope again function three(){

 var a = 3;
 alert(a);

}

// Intermediate: no such thing as block scope in javascript function four(){

   if(true){
       var a=4;
   }
   alert(a); // alerts '4', not the global value of '1'

}


// Intermediate: object properties function Five(){

   this.a = 5;

}


// Advanced: closure var six = function(){

   var foo = 6;
   return function(){
       // javascript "closure" means I have access to foo in here, 
       // because it is defined in the function in which I was defined.
       alert(foo);
   }

}()


// Advanced: prototype-based scope resolution function Seven(){

 this.a = 7;

}

// [object].prototype.property loses to [object].property in the scope chain Seven.prototype.a = -1; // won't get reached, because 'a' is set in the constructor above. Seven.prototype.b = 8; // Will get reached, even though 'b' is NOT set in the constructor.


// These will print 1-8 one(); two(2); three(); four(); alert(new Five().a); six(); alert(new Seven().a);

alert(new Seven().b);</lang>

Joy

JOY does not have variables. Variables essentially name locations in memory, where values are stored. JOY also uses memory to store values, but has no facility to name these locations. The memory that JOY uses is commonly referred to as "the stack".

Initializing

The JOY stack can be initialized: <lang joy>[] unstack</lang>

Assignment

Values can be pushed on the stack: <lang joy>42</lang> pushes the value 42 of type integer on top of the stack.

Stack

Calling the stack by name pushes a copy of the stack on the stack. To continue the previous example: <lang joy>stack</lang> pushes the list [42] on top of the stack. The stack now contains: [42] 42.

Historically, Logo only had global variables, because they were easier to access when stepping through an algorithm. Modern variants have added dynamic scoped local variables.

Works with: UCB Logo

<lang logo>make "g1 0 name 2 "g2  ; same as make with parameters reversed global "g3  ; no initial value to func :x

 make "g4 4   ; still global
 localmake "L1 6
 local ["L2 "L3]    ; local variables, collection syntax
 func2 :g4
 print :L2      ; 9,  modified by func2
 print :L3      ; L3 has no value, was not modified by func2

end to func2 :y

 make "g3 :y
 make "L2 :L1 + 3     ; dynamic scope: can see variables of callers
 localmake "L3 5       ; locally override L3 from caller
 (print :y :L1 :L2 :L3)      ; 4 6 9 5

end print :g4  ; 4 print :L1  ; L1 has no value print name? "L1  ; false, L1 is not bound in the current scope</lang>

LotusScript

<lang Lotusscript>Sub Click() 'a few declarations as example Dim s as New NotesSession ' declaring a New NotesSession actually returns the current, active NotesSession Dim i as Integer ' i = 0 Dim s as String ' s= "" Dim v as Variant ' v is nothing Dim l as Long ' l = 0 Dim doc as NotesDocument 'doc is EMTPY

'...

End Sub </lang>

Modula-3

<lang modula3>MODULE Foo EXPORTS Main;

IMPORT IO, Fmt;

VAR foo: INTEGER := 5; (* foo is global (to the module). *)

PROCEDURE Foo() =

 VAR bar: INTEGER := 10; (* bar is local to the procedure Foo. *)
 BEGIN
   IO.Put("foo + bar = " & Fmt.Int(foo + bar) & "\n");
 END Foo;

BEGIN

 Foo();

END Foo.</lang>

For procedures, the formal parameters create local variables unless the actual parameter is prefixed by VAR: <lang modula3>PROCEDURE Foo(n: INTEGER) =</lang> Here, n will be local to the procedure Foo, but if we instead wrote: <lang modula3>PROCEDURE Foo(VAR n: INTEGER) =</lang> Then n is the global variable n (if it exists).

OCaml

The default handlers for values in OCaml are not variables strictly speaking, because as OCaml is a functional language these values can't vary (so are not variable). Strictly speaking these are bindings. An identifier is bound to a value in an immutable way.

The standard way to bind an identifier to a value is the let construct: <lang ocaml>let x = 28</lang>

This stated, ocaml programmers most often use the word variable when they refer to bindings, because in the programming world we usually use this word for the default values handlers.

Now to add confusion, real variables also exist in OCaml because it is an impure functional language. They are called references and are defined this way: <lang ocaml>let y = ref 28</lang> References can then be accessed and modified this way: <lang ocaml> !y (* access *)

 y := 34  (* modification *)</lang>

An identifier can not be declared uninitialised, it is always defined with an initial value, and this initial value is used by the OCaml type inference to infer the type of the binding.

Inside an expression, bindings are defined with the let .. in construct, and we can also define multiple bindings with the let .. and .. in construct (here the expression can be the definition of a new identifier or the definition of a function): <lang ocaml>let sum = (* sum is bound to 181 *)

 let a = 31
 and b = 150 in
 (a + b)

let sum () = (* sum is a function which returns 181 *)

 let a = 31
 and b = 150 in
 (a + b)</lang>


Oz

Variable names in Oz always start with an uppercase letter.

Oz variables are dataflow variables. A dataflow variable can basically be free (unbound) or determined (has a value). Once a value has been assigned, it can not be changed. If we assign the same value again, nothing happens. If we assign a different value to an already determined variable, an exception is raised: <lang oz>declare Var  %% new variable Var, initially free {Show Var} Var = 42  %% now Var has the value 42 {Show Var} Var = 42  %% the same value is assigned again: ok Var = 43  %% a different value is assigned: exception</lang>

In the Emacs-based interactive environment, declare creates a new open scope in which variables can be declared. The variables are visible for the entire rest of the session.

Most operations on free variables block until the variables have been bound (but not Show as used above).

Assignment to dataflow variables is also called unification. It is actually a symmetric operation, e.g. the following binds B to 3: <lang oz>declare

 A = 3
 B

in

 A = B
{Show B}</lang>

However, variables can only be introduced at the left side of the = operator. So this is a syntax error: <lang oz>declare

 A = 3
 A = B  %% Error: variable B not introduced

in

{Show B}</lang>

It is possible to introduce multiple variables in a single statement: <lang oz>declare

  [A B C D] = [1 2 3 4]  %% unification of two lists</lang>

In a module definition, toplevel variables can be introduced between the keywords define and end without the need for declare. The range between these two keywords is also their scope. Toplevel variables can optionally be exported. <lang oz>functor export Function define

  ToplevelVariable = 42
  fun {Function}
    42
  end

end</lang>

Function and class definitions introduce a new variable with the name of the function/class and assign the new function/class to this variable.

Most Oz statement introduce a new scope and it is possible to introduce local variables at the top of this scope with the in keyword. <lang oz>fun {Function Arg}

  LocalVar1

in

  LocalVar1 = if Arg == 42 then

LocalVar2 in LocalVar2 = yes LocalVar2 else LocalVar3 = no  %% variables can be initialized when declared in LocalVar3 end

  LocalVar1

end</lang> Here, LocalVar1 is visible in the whole body of Function while LocalVar2 is only visible in the then branch and LocalVar3 is only visible in the else branch.

Additionally, new local variables can be introduced everywhere using the keyword local. <lang oz>if {IsEven 42} then

  {System.showInfo "Here, LocalVar is not visible."}
  local
     LocalVar = "Here, LocalVar IS visible"
  in
     {System.showInfo LocalVar}
  end

end</lang>

New variables are also introduced in pattern matching. <lang oz>case "Rosetta code" of First|_ then {Show First} end %% prints "R"</lang> _ creates a new nameless variable that is initially unbound. It is usually pronounced "don't care".

It is possible to create a read-only view of a variable with the !! operator. This is called a "future". We can wait for such a variable to become bound by another thread and we can read its value, but we can never set it. <lang oz>declare

 A
 B = !!A %% B is a read-only view of A

in

 thread
    B = 43 %% this blocks until A is known; then it fails because 43 \= 42
 end
 A = 42</lang>

Additional operations on variables: <lang oz>declare

 V = 42

in

 {Wait V}  %% explicitly wait for V to become determined
 if {IsDet V} then  %% check whether V is determined; not recommended
    {Show determined}
 elseif {IsFree V} then  %% check whether V is free; not recommended
    {Show free}
 end</lang>

IsFree and IsDet are low-level functions. If you use them, you code is no longer declarative and prone to race conditions when used in a multi-threaded context.

To have mutable references like in imperative languages, use cells: <lang oz>declare

 A = {NewCell 42}
 OldVal

in

 {Show @A}         %% read a cell with @
 A := 43           %% change its value
 OldVal = A := 44  %% read and write at the same time (atomically)</lang>

A is an immutable dataflow variable that is bound to a mutable reference.

Perl

Variables can be declared with our, my, or local, or they can be used without being declared at all; see scope modifiers for the differences. In any case, variables which haven't been assigned to have the undefined value by default. The undefined value acts just like 0 (if used as a number) or the empty string (if used as a string), except it can be distinguished from either of these with the defined function. Also, if warnings are enabled, perl will print a message like "Use of uninitialized value $foo in addition (+)" whenever you use the undefined value as a number or string.

Initialization and assignment are the same thing in Perl: just use the = operator. Note that the rvalue's context (scalar or list) is determined based on the lvalue.

<lang perl>my $x = @a; # Scalar assignment; $x is set to the

                             # number of elements in @a.

my ($x) = @a; # List assignment; $x is set to the first

                             # element of @a.

my @b = @a; # List assignment; @b becomes the same length

                             # as @a and each element becomes the same.

my ($x, $y, @b) = @a; # List assignment; $x and $y get the first

                             # two elements of @a, and @b the rest.

my ($x, $y, @b, @c, $z) = @a; # Same thing, and also @c becomes empty

                             # and $z undefined.</lang>

The kind of value a variable can hold depends on its sigil, "sigil" being a slang term for "funny character in front of a variable name". $dollarsigns can hold scalars: the undefined value, numbers, strings, or references. @atsigns can hold arrays of scalars, and %percentsigns can hold hashes of scalars (associative arrays mapping strings to scalars); nested data structures are constructed by making arrays or hashes of references to arrays or hashes.

There are two other sigils, but they behave quite unlike the others. A token of the form &foo refers to a subroutine named foo. In older versions of Perl, ampersands were necessary for calling user-defined subroutines, but since they no longer are, they have only a handful of obscure uses, like making references to named subroutines. Note that you can't assign to an ampersand-marked name. But you can assign to a typeglob, a kind of object represented with the notation *var. A typeglob *foo represents the symbol-table entry for all of the otherwise independent variables $foo, @foo, %foo, and &foo. Assigning a string "bar" to *foo makes these variables aliases for $bar, @bar, %bar, and &bar respectively. Alternatively, you can assign a reference to a typeglob, which creates an alias only for the variable of the appropriate type. In particular, you can say *twiddle = sub {...} to change the definition of the subroutine &twiddle without affecting $twiddle and friends.

PowerShell

Variables in PowerShell start with a $ character, they are created on assignment and thus don't need to be declared: <lang powershell>$s = "abc" $i = 123</lang> Uninitialized variables expand to nothing. This may be interpreted for example as an empty string or 0, depending on context: <lang powershell>4 + $foo # yields 4 "abc" + $foo + "def" # yields "abcdef"</lang> Variables all show up in the Variable: drive and can be queried from there with the usual facilities: <lang powershell>Get-ChildItem Variable:</lang> Since Variables are provided via a flat filesystem, they can be manipulated using the common cmdlets for doing so. For example to delete a variable one can use <lang powershell>Remove-Item Variable:foo</lang> as if it were a file or a registry key. There are, however, several cmdlets dealing specifically with variables: <lang powershell>Get-Variable # retrieves the value of a variable New-Variable # creates a new variable Set-Variable # sets the value of a variable Clear-Variable # deletes the value of a variable, but not the variable itself Remove-Variable # deletes a variable completely</lang>

Python

Names in Python are not typed, although all the objects referred to by them, are. Names are lexically scoped by function/method/class definitions, and must be defined before use.

Names in global statements are looked up in the outermost context of the program or module. Names in a nonlocal statement are looked up in the order of closest enclosing scope outwards.

R

Variables are dynamically typed, so they do not need to be declared and instantiated separately. <- and = are both used as the assignment operator, though <- is preferred, for compatibility with S-Plus code. <lang R>foo <- 3.4 bar = "abc"</lang> It is possible to assign multiple variables with the same value, and to assign values from left to right. <lang R>baz <- quux <- 1:10 TRUE -> quuux</lang> There are also global assignment operators, <<- and ->>. From their help page:

The operators '<<-' and '->>' cause a search to made through the
environment for an existing definition of the variable being
assigned.  If such a variable is found (and its binding is not
locked) then its value is redefined, otherwise assignment takes
place in the global environment.

In practice, this usually means that variables are assigned in the user workspace (global environment) rather than a function. <lang R>a <- 3

assignmentdemo <- function() {

  message("assign 'a' locally, i.e. within the scope of the function")
  a <- 5
  message(paste("inside assignmentdemo, a = ", a))
  message(paste("in the global environment, a = ", get("a", envir=globalenv())))
  
  message("assign 'a' globally")
  a <<- 7
  message(paste("inside assignmentdemo, a = ", a))
  message(paste("in the global environment, a = ", get("a", envir=globalenv())))

} assignmentdemo()</lang>

assign 'a' locally, i.e. within the scope of the function
inside assignmentdemo, a =  5
in the global environment, a =  3
assign 'a' globally
inside assignmentdemo, a =  5
in the global environment, a =  7

Finally, there is also the assign function, where you choose the environment to assign the variable. <lang R>assign("b", TRUE) #equivalent to b <- TRUE assign("c", runif(10), envir=globalenv()) #equivalent to c <<- runif(10)</lang>

Ruby

Information taken from Variables page at the Ruby User's Guide

Ruby has three kinds of variables, one kind of constant and exactly two pseudo-variables. The variables and the constants have no type. While untyped variables have some drawbacks, they have many more advantages and fit well with ruby's quick and easy philosophy.

Variables must be declared in most languages in order to specify their type, modifiability (i.e., whether they are constants), and scope; since type is not an issue, and the rest is evident from the variable name as you are about to see, we do not need variable declarations in ruby.

The first character of an identifier categorizes it at a glance:

$ global variable
@ instance variable
[a-z] or _ local variable
[A-Z] constant

The only exceptions to the above are ruby's pseudo-variables: self, which always refers to the currently executing object, and nil, which is the meaningless value assigned to uninitialized variables. Both are named as if they are local variables, but self is a global variable maintained by the interpreter, and nil is really a constant. As these are the only two exceptions, they don't confuse things too much.

Referencing an undefined global or instance variable returns nil. Referencing an undefined local variable throws a NameError exception.

<lang ruby>$a_global_var = 5 class Demo

 @@a_class_var = 6
 A_CONSTANT = 8
 def initialize
   @an_instance_var = 7
 end
 def incr(a_local_var)
   @an_instance_var += a_local_var
 end

end</lang>

Tcl

Tcl's variables are local to procedures, lambdas and methods by default, and there is no initialization per se: only assignment when the variable previously did not exist.

Demonstrating: <lang tcl>namespace eval foo {

   # Define a procedure with two formal arguments; they are local variables
   proc bar {callerVarName argumentVar} {
       ### Associate some non-local variables with the procedure
       global globalVar;      # Variable in global namespace
       variable namespaceVar; # Variable in local (::foo) namespace
       # Access to variable in caller's context; may be local or global
       upvar 1 callerVarName callerVar
       ### Reading a variable uses the same syntax in all cases
       puts "caller's var has $callerVar"
       # But global and namespace vars can be accessed by using qualified names
       puts "global var has $globalVar which is $::globalVar"
       ### Writing a variable has no special syntax
       ### but [set] is by far the most common command for writing
       set namespaceVar $globalVar
       incr globalVar
       ### Destroying a variable is done like this
       unset argumentVar
   }

}</lang> The main thing to note about Tcl is that the "$" syntax is a language level operator for reading a variable and not just general syntax for referring to a variable.

TI-89 BASIC

A variable not declared local (to a program or function) is global. Global variables are grouped into folders of which one is current at any given time. Global variables persist until deleted (or reset or power loss, unless they are archived).

<lang ti89b>Local mynum, myfunc</lang>

Variables may be assigned with the or Define statements, both of which assign a new value to a variable. is typically used interactively, but only Define can assign programs or multi-statement functions.

<lang ti89b>Define mynum = 1 © Two ways to assign a number 1 → mynum

Define myfunc(x) = (sin(x))^2 © Two ways to assign a function (sin(x))^2 → myfunc(x)

Define myfunc(x) = Func © Multi-statement function

 If x < 0 Then
   Return –x
 Else
   Return x
 EndIf

EndFunc</lang>

XSLT

Although called variables, XSLT "variable" elements are single-assignment, and so behave more like constants. They are valid in the node scope in which they are declared. <lang xml><xsl:variable name="foo" select="XPath expression" /> <xsl:if test="$foo = 4">... </xsl:if> </lang>