aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/info/mds.texinfo110
1 files changed, 107 insertions, 3 deletions
diff --git a/doc/info/mds.texinfo b/doc/info/mds.texinfo
index a78852a..d5162d3 100644
--- a/doc/info/mds.texinfo
+++ b/doc/info/mds.texinfo
@@ -5174,7 +5174,7 @@ line feeds for new lines.
* Keyboard Layout Identification:: Specifing the layout language, country and variant.
* Layout Assumptions:: Making assumption about the keyboard layout.
* Include Statement:: Including base files.
-* Layout Macros:: Reducing repetition.
+* Layout Macros and Functions:: Reducing repetition.
@end menu
@@ -5549,8 +5549,8 @@ include "../common/base"
-@node Layout Macros
-@subsection Layout Macros
+@node Layout Macros and Functions
+@subsection Layout Macros and Functions
There is a lot of repetitive work in layouts, for instance
all letters need mapping for any combination of use of
@@ -5644,6 +5644,110 @@ end for
instead of using the alternation-trick.
+You call also use if-statments. For example
+
+@example
+for "à" to "þ" as \1
+ # times sign is not upper case of division sign
+ if \not(\equals(\a "\u00F7"))
+ letter(\1 \add(\sub(\1 "à") "À"))
+ end if
+end for
+@end example
+
+or equivalently
+
+@example
+for "à" to "þ" as \1
+ if \equals(\a "\u00F7")
+ continue # times sign is not upper case of division sign
+ end if
+ letter(\1 \add(\sub(\1 "à") "À"))
+end for
+@end example
+
+@code{continue} can be used to stop the iteration of
+the innermost for-loop and skip to the next iteration.
+You can also use @code{break}, but it also has the
+effect to stop the entire loop. Similarly, @code{return}
+can be used to break an entire macro call, or function
+call.
+
+You can also use @code{if} for more example things,
+and use @code{else if} and @code{else if}:
+
+@example
+macro latter/1
+ if \not(\greater(\1 "z"))
+ letter(\1 \add(\sub(\1 "a") "A"))
+ else if \not(\greater(\1 "þ"))
+ letter(\1 \add(\sub(\1 "à") "À"))
+ else
+ letter(\1 \sub(\1 1))
+ end if
+end macro
+@end example
+
+Note that there is no quotes around the `a'
+in @code{letter(\1 \sub(\1 1))}. This means
+that the argument will be than value 1 rather
+than the code point of the character `1'. Note
+however that values lower than zero or equals
+to or greater than 2 to the power of 31 not
+allowed and can either cause compile-time
+error or erroneous compiled files.
+
+Functions are similar to function macros,
+the difference is that a function is called
+inline and is prefixed with slash, and rather
+than inline the code inside it, the evalutes
+to the last value it evaluted before it returned.
+
+For example instead of @code{\not(\greater(\1 "z"))}
+you can write @code{\less_eq(\1 "z")} after you
+have defined the function `less_eq/2' with the
+following code:
+
+@example
+function less_eq/2
+ \not(\greater(\1 \2))
+end function
+@end example
+
+A final constract to make layout code less
+repetitive is let-statements. This can be
+used to assign values to variables, and
+declar variables in undefined. Variable names
+can only be numerical and most not start with
+a zero. @code{\0} is not valid variable name.
+
+The code
+
+@example
+macro latter/1
+ if \not(\greater(\1 "z"))
+ letter(\1 \add(\sub(\1 "a") "A"))
+ else if \not(\greater(\1 "þ"))
+ letter(\1 \add(\sub(\1 "à") "À"))
+ else
+ letter(\1 \sub(\1 1))
+ end if
+end macro
+@end example
+
+can equivalently be writen using @code{let} as
+
+@example
+macro latter/1
+ let \2 : 1
+ if \not(\greater(\1 "z"))
+ let \2 : \sub("a" "A")
+ else if \not(\greater(\1 "þ"))
+ let \2 : \sub("à" "À")
+ end if
+ letter(\1 \sub(\1 \2))
+end macro
+@end example