Grip User Manual **************** This manual documents Grip version 0.2.0. Copyright (C) 2011 - 2018 David Pirotte Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled “GNU Free Documentation License.” Grip User Manual Preface Contributors to this Manual The Grip License 1 Introduction 1.1 About Grip 1.2 Objective 1.3 The name 1.4 Savannah 1.5 Obtaining and Installing Grip 1.5.1 Dependencies 1.5.2 Quickstart 1.6 Contact 1.7 Reporting Bugs 2 Using Grip 2.1 Grip 2.2 Grip-SQLite 2.3 Grip-Gnome 2.4 Grip-Clutter 3 API Reference 3.1 Modules 3.2 Goops 3.3 Optional Arguments 3.4 Lists 3.5 Strings 3.6 Queues 3.7 Stores 3.8 Iterations 3.9 Angles 3.10 Floats 3.11 REPL Servers 3.12 Xft 3.13 Utilities Appendix A GNU Free Documentation License Concept Index Procedure Index Variable Index Type Index Preface ******* This manual describes how to use Grip. It relates particularly to Grip version 0.2.0. Contributors to this Manual =========================== Like Grip itself, the Grip user manual is a living entity. Right now, the contributors to this manual are: • David Pirotte David is also the author and maintainer of Grip. You are most welcome to join and help. Visit Grip’s web site (http://www.nongnu.org/grip/index.html) to find out how to get involved. The Grip License ================ Grip is Free Software. Grip is copyrighted, not public domain, and there are restrictions on its distribution or redistribution: • Grip and supporting files are published under the terms of the GNU General Public License version 3 or later. See the file ‘LICENSE’. • This manual is published under the terms of the GNU Free Documentation License (*note GNU Free Documentation License::). You must be aware there is no warranty whatsoever for Grip. This is described in full in the license. 1 Introduction ************** 1.1 About Grip ============== Grip (http://www.nongnu.org/grip/index.html), a Grip of Really Important Procedures, is a Guile (http://www.gnu.org/software/guile) Scheme toolbox currently composed of _Grip_ itself, _Grip-SQLite_, _Grip-Gnome_ and _Grip-Clutter_. *Notes:* _Grip (core)_, _Grip-SQLite_ and _Grip-Gnome_ are being rewritten and documented, you will spot that by yourself in the code if you visit it, and read the documentation. Until this process is complete, the modules you can safely use and rely on are the _Grip (core)_ modules that are documented, as well as all _Grip-Clutter_ modules and examples. You are welcome to try and use Grip (http://www.nongnu.org/grip/index.html), and, keeping the above in mind, help us to get it better - reviewing its interface design, the source code, its tests and documentation. New features are also welcome! Though in order to acheive stability, to the best we can, we should, with all due respect and kindness, be ’nit-picky’ with each other, and only include those that reach a consensus, first with respect to their inclusion per se, then in terms of interface design, implementation, tests and documentation. 1.2 Objective ============= Grip (http://www.nongnu.org/grip/index.html) started as a personnal toolbox, aggregating modules I wrote to support other projects and clearly hosting ’reusable’ functionalities. Now that I started to revisit Grip’s core modules [May 2018], restructuring and rewritting them, with a proper interface design, implementation, documentation and test-suite, now is a good time to share this work and invite other guilers to either use Grip, or even beter contribute to it. The idea is similar to the one expressed in Guile-Lib (http://www.nongnu.org/guile-lib), that is, a place for people to collaborate to the development of a common library, though less intimidating maybe and, unlike Guile-Lib, Grip will tolerate, under strict conditions, some C code: this is notably to support and boost Guile-CV (http://www.nongnu.org/guile-lib) floating point operations, at least till Guile (http://www.gnu.org/software/guile) has an AOT compiler, able to offer similar performance results for fixed size floating points and integer operations. I should mention that I started Grip far before I became one of the Guile-Lib co-maintainer, and that the intention is not to compete with it, but rather, to offer sort of a code staging for it, where people can experiment new functionalities with a bit more flexibility. With time, the well designed, stable, documented and tested pure scheme interfaces could be moved to Guile-Lib. 1.3 The name ============ The term *Grip* is from the early era of the circus. See the following Wikipedia (https://en.wikipedia.org/wiki/Grip_(job)), page for a full description, where you’ll read the following extract: ... From there it was used in vaudeville and then in today’s film sound stages and sets. Some have suggested the name comes from the 1930s–40s slang term for a *Tool Bag* or *Grip* that these technicians use to carry their tools... 1.4 Savannah ============ Grip (http://www.nongnu.org/grip/index.html) also has a Savannah (http://savannah.nongnu.org/projects/grip) (non GNU) project page. 1.5 Obtaining and Installing Grip ================================= _Grip_ can be obtained from the following archive (http://download.savannah.gnu.org/releases/grip) site. The file will be named _grip-version.tar.gz_. The current version is 0.2.0, so the file you should grab is: grip-0.2.0.tar.gz (http://download.savannah.gnu.org/releases/grip/grip-0.2.0.tar.gz) 1.5.1 Dependencies ------------------ Grip will look for the following dependencies and will try to install all its components, but will only do so if it can effectively install Grip core and statisfy the component specific requirement(s). *Grip* • Autoconf >= 2.69 • Automake >= 1.14 • Guile-2.0 (http://www.gnu.org/software/guile) >= 2.0.14 or Guile-2.2 *Grip-SQLite* • SQLite (http://www.sqlite.org) >= 3.7 *Grip-Gnome* • Guile-Gnome (http://www.gnu.org/software/guile-gnome) >= 2.16.5, the following wrappers: Glib, Gobject, Gtk, libglade *Grip-Clutter* • Guile-Clutter (http://www.gnu.org/software/guile-gnome/clutter) >= 1.12.2.1 1.5.2 Quickstart ---------------- Assuming you have satisfied the dependencies, open a terminal and proceed with the following steps: cd tar zxf grip-0.2.0.tar.gz cd grip-0.2.0 ./configure [--prefix=/your/prefix] [--with-guile-site=yes] make make install Grip comes with a tests suite, which you may run (recommended) using: make check Happy Grip! *Notes:* 1. The default and ‘--prefix’ installation locations for source modules and compiled files (in the absence of ‘--with-guile-site=yes’, otherwise see below) are: $(datadir)/grip $(libdir)/grip/guile/$(GUILE_EFFECTIVE_VERSION)/site-ccache In the above, $(datadir) is substituted to the default ‘/usr/local/share’ or ‘/your/prefix/share’ and $(libdir) is substituted to ‘/usr/local/lib’ or ‘/your/prefix/lib’, when/if ‘--prefix’ was passed. $(GUILE_EFFECTIVE_VERSION) is substituted to the stable version number with which Grip is being compile, for example, 2.2 Unless you passed ‘--with-guile-site=yes’, you must augment Guile’s %load-path and %load-compiled-path, respectively, with the two (substituted) paths described above, so that Guile finds Grip’s installed source modules and compiled files. To do this, you either (a) create/update your personnal ~/.guile file, (b) update Guile’s global site init.scm file or (c) define/update both GUILE_LOAD_PATH and GUILE_LOAD_COMPILED_PATH (Make sure you read Guile’s manual ‘Environment Variables’ and ‘Load Paths’ subsections if you are not familiar). Here is an example for (c), assuming these variables were not already defined and no ‘--prefix’ has been given, using the Bash shell: export GUILE_LOAD_PATH="/usr/local/share/grip" export GUILE_LOAD_COMPILED_PATH="/usr/local/lib/grip/guile/2.2/site-ccache" 2. If you pass ‘--with-guile-site=yes’, Grip’s source modules and compiled files will be installed using Guile’s global site and site-ccache directories, respectively. You may check these two locations using: guile -c "(display (%global-site-dir)) (newline)" guile -c "(display (%site-ccache-dir)) (newline)" 3. To install Grip, you must have write permissions to the default or $prefix dir and its subdirs, as well as to both Guile’s global site and site-ccache directories if ‘--with-guile-site=yes’ was passed. 4. Like for any other GNU Tool Chain compatible software, you may install the documentation locally using ‘make install-html’ [or ‘make install-pdf’ ...]. 1.6 Contact =========== Mailing lists ------------- Grip uses Guile’s mailing lists: is for general user help and discussion; is used to discuss most aspects of Grip, including development and enhancement requests. Please use ’Grip: ’ to preceed the subject line of Grip related emails, thanks! IRC --- Most of the time you can find me on irc, channel ‘#guile’, ‘#guix’ and ‘#scheme’ on ‘irc.freenode.net’, ‘#clutter’ and ‘#introspection’ on ‘irc.gnome.org’, under the nickname ‘daviid’. 1.7 Reporting Bugs ================== Grip does not have its own bug reports mailing list yet. Please send your bug reports to one of the Guile’s (http://www.gnu.org/software/guile) mailing listts: Please use ’Grip - bug report: ’ to preceed the subject line of Grip bug reports related emails, thanks! 2 Using Grip ************ Grip User’s Manual still is a mock-up: any help is more then welcome to improve this situation, thanks! 2.1 Grip ======== 2.2 Grip-SQLite =============== 2.3 Grip-Gnome ============== 2.4 Grip-Clutter ================ 3 API Reference *************** 3.1 Modules =========== Grip functionality that extends Guile’s module system. The module is loaded by entering the following: (use-modules (grip module)) Procedures, Macros and Syntax ----------------------------- Procedures, Macros and Syntax ----------------------------- -- Macro: re-export-public-interface mod1 mod2 mod3 ... Returns nothing. Re-export the public interface of MOD1, MOD2, MOD3 ... -- Procedure: module-g-export! module names Returns nothing. Add all names (which must be a list of symbols or pairs of symbols) to the list of exported or re-exported bindings of the current module. name is a pair, its car gives the name of the variable as seen by the current module and its cdr specifies a name for the binding in the current module’s public interface. Bindings that are re-exported are those imported by the current module from some other module. *Note:* ‘module-g-export!’ stands for ‘module goops export!’ and should only be used for ‘getters’, ‘setters’, ‘accessors’ and ‘methods’. It is provided so that users may ‘automatically’ either add method(s) to imported generic functions and re-export the generic function name, or create and export a new name for the generic function hosting the current module method(s), when the name is not exported by any imported module. -- Syntax: g-export variable ... Returns nothing. Add all variables (which must be symbols or pairs of symbols) to the list of exported or re-exported bindings of the current module. If variable is a pair, its car gives the name of the variable as seen by the current module and its cdr specifies a name for the binding in the current module’s public interface. Bindings that are re-exported are those imported by the current module from some other module. ‘g-export’ works both at compile-time and run-time. *Note:* ‘g-export’ stands for ‘goops export’ and should only be used for ‘getters’, ‘setters’, ‘accessors’ and ‘methods’. It is provided so that users may ‘automatically’ either add method(s) to imported generic functions and re-export the generic function name, or create and export a new name for the generic function hosting the current module method(s), when the name is not exported by any imported module. 3.2 Goops ========= Grip functionality that extends and/or specializes Goops (http://www.gnu.org/software/guile/manual/guile.html#GOOPS): (use-modules (grip goops)) This module import and re-export the public interface of the Guile module ‘(oop goops)’. It also imports the Guile module ‘(oop goops describe)’, which defines six ‘describe’ methods that this module also re-export. Syntax and Methods ------------------ Syntax and methods ------------------ -- Syntax: define-method* (generic parameter ... [#:optional vardef…] [#:key vardef… [#:allow-other-keys]] [#:rest var | . var]) body1 body2 ... Returns a method. ‘define-method*’ is like define-method (https://www.gnu.org/software/guile/manual/html_node/Methods-and-Generic-Functions.html#Methods-and-Generic-Functions), except with some extensions to allow optional and keyword arguments. Please refer to lambda* and define* (https://www.gnu.org/software/guile/manual/html_node/lambda_002a-and-define_002a.html#lambda_002a-and-define_002a) for a complete description of how you may specify and refer to ‘#:optional’ and ‘#:key’ arguments. For a simple example, see the definition of ‘get-color’ in the module ‘(grip clutter color)’. -- Method: class-direct-virtual-slots (class ) Return a list containing the slot definitions of the direct slots of CLASS for which the allocation is ‘#:virtual’. -- Method: class-virtual-slots (class ) Return a list containing the slot definitions for all CLASS slots, including any slots that are inherited from superclasses, for which the allocation is ‘#:virtual’. -- Method: describe (x ) -- Method: describe (x ) -- Method: describe (x ) -- Method: describe (x ) -- Method: describe (x ) -- Method: describe (x ) . omit-generic Retrieves and displays ‘sensible’ information upon X. 3.3 Optional Arguments ====================== Grip procedures to process optional and keyword arguments. The module is loaded by entering the following: (use-modules (grip optargs)) Procedures ---------- Procedures ---------- -- Procedure: split-keyword-args keywords args Returns two values: a list containing the keyword arguments listed in KEYWORDS; a list containing all other arguments. -- Procedure: strip-keyword-args keywords args Returns a list. Remove the keyword arguments listed in KEYWORDS from ARGS (internally, it calls *note split-keyword-args:: and returns the second received values). 3.4 Lists ========= Grip procedures to process lists. The module is loaded by entering the following: (use-modules (grip list)) Procedures ---------- Procedures ---------- -- Procedure: list-pos item lst [pred eq?] Returns the index of the first element in LST which statisfies ‘(pred element item)’. Otherwise, it returns ‘#f’. -- Procedure: list-insert item lst pos Returns a list. Inserts ITEM at the beginning of LST if POS is inferior or equal to ‘zero’, at the given position if POS is inferior to the length of LST, and at the end of LST if POS is equal or superior to the length of LST. -- Procedure: list-replace-all old new lst [pred eq?] Returns a list. All elements in LST that satisfies ‘(pred element old)’ are replaced by NEW. -- Procedure: interleave l1 l2 l3 ... Returns a list. The result is the concatenation of the tuples composed of one element of L1 L2 L3 ... taken at the same index. The first index is ‘zero’, the last idex is ‘(- n 1)’, where ‘n’ is the length of the shortest list. -- Procedure: flatten lst Returns a ‘non-nested’ list obtained by removing all ‘nested structure’ from LST, while retaining all of its elements, hence flattening LST. For example: (flatten '(1 2 (3) (4 (5 (6 (7 8) 9) (10 11))) 12)) ⊣ $4 = (1 2 3 4 5 6 7 8 9 10 11 12) 3.5 Strings =========== Grip procedures and variables to process strings. The module is loaded by entering the following: (use-modules (grip string)) Procedures ---------- Variables --------- Procedures ---------- -- Procedure: string-replace-all str s1 s2 [#:start 0] [#:end (string-length str)] Returns a string. Replace all occurrences of S1 in the START END range of STR by S2. It is an error to pass an empty S1 value. -- Procedure: string-delete-all str s1 [#:start 0] [#:end (string-length str)] Returns a string. Delete all occurrences of S1 in the START END range of STR. It is an error to pass an empty S1 value. -- Procedure: string-escape str c1 c2 c3 ... Returns a string. Replaces all STR occurrences of C1, C2, C3 ... by \C1, \C2, \C3 ... -- Procedure: string-escape-sql str Returns a string. Replaces all STR occurrences of ‘'’ by ‘''’. -- Procedure: string-escape-filename str [chars %filename-reserved-chars] Returns a string. This procedure is implemented as ‘(apply string-escape str chars)’, where CHARS, which is optional, defaults to the list given by *note %filename-reserved-chars::. If you provide your own list of chars and if it contains ‘\’, then it must be the first element of the list (since ‘\’ is the escape char itself). -- Procedure: string-tokens str [#:start 0] [#:end (string-length str)] c1 c2 c3 ... Returns a a list of strings. Split the string into a list of substring, where each substrig is a maximal non-empty contiguous sequence of characters, defined as: (char-set-complement (apply char-set chars)) If START or END are provided, they restrict ‘string-tokens’ to operate on the indicated substring of STR. -- Procedure: string-contains-ixs s1 s2 [#:start1 0] [end1 (string-length s1)] [#:start2 0] [end2 (string-length s2)] Returns three values. If S1 contains S2, the returned values are the S1 index of the first char of S2, the S1 index of the first char that follows S2, and the length of S2. Otherwise, it returns ‘#f #f’ and the length of S2. The optional keyword start/end indices maybe be provided to restrict the operation to the indicated substring. -- Procedure: string-contains-ci-ixs s1 s2 [#:start1 0] [#:end1 (string-length s1)] [#:start2 0] [#:end2 (string-length s2)] Returns three values. If S1 contains S2, the returned values are the S1 index of the first char of S2, the S1 index of the first char that follows S2, and the length of S2. Otherwise, it returns ‘#f #f’ and the length of S2. The optional keyword start/end indices maybe be provided to restrict the operation to the indicated substring. Character comparison is done case-insensitively. -- Procedure: string-span str p1 v1 p2 v2 p3 v3 ... Returns a string. Makes a ‘span’ string as defined by the Pango Text Attribute Markup Language (https://developer.gnome.org/pango/stable/PangoMarkupFormat.html). Note that ‘string-span’ does not verify the validity of provided properties and values. For example: (string-span "Guile" "foreground" "blue" "size" "x-large") ⊣ $2 = "Guile" It is an error to pass an odd quantity of properties and values. -- Procedure: string-read str Returns a value. The returned value is the result of calling ‘read’ upon STR, as in: (with-input-from-string str read) Variables --------- -- Variable: %filename-reserved-chars A list containing the following characters: \ space < > | ( ) & ; # ? * 3.6 Queues ========== Grip module that provides FIFO queue - list based - syntaxes, which you may load using: (use-modules (grip queue)) Syntax ------ Syntax ------ -- Syntax: push item lst -- Syntax: push! item lst Return a list, defined as ‘(cons item lst)’. ‘push!’ mutates LST so it contains the returned list. -- Syntax: push* i1 i2 i3 ... lst -- Syntax: push*! i1 i2 i3 ... lst Return a list, defined as ‘(cons* i1 i2 i3 ... lst)’. ‘push*!’ mutates LST so it contains the returned list. -- Syntax: pop lst -- Syntax: pop! lst Return a list, defined as ‘(cdr lst)’. ‘pop!’ mutates LST so it contains the returned list. -- Syntax: pop* lst n-item -- Syntax: pop*! lst n-item Return a list, defined as ‘(drop lst n-item)’. ‘pop*!’ mutates LST so it contains the returned list. 3.7 Stores ========== Grip module that provides the ‘’ class and its methods, which you may import using: (use-modules (grip store)) Conceptually, a store - as in storage - is a simple key-value database, based on Goops (http://www.gnu.org/software/guile/manual/guile.html#GOOPS) and Association Lists (https://www.gnu.org/software/guile/manual/guile.html#Association-Lists), meant to be used to handle small number of entries only(1). Store entry keys are symbols, and equality tests use ‘eq?’ (it uses ‘assq’ and ‘assq-’ prefixed association lists procedures). In a store, there can only be a single entry for a given key (stores do not use the ‘acons’ procedure)(2). Like in scheme, methods that mutate a ‘’ inventory are postfixed using ‘!’. In scheme, ‘set!’ is a syntax, and therefore it is not possible to create a generic function for its name and add a method with its code ... as a consequence, we had to choose another name, and went for ‘set-!’ Here is a small (incomplete) example: (define a-store (init! (make ) '((foo . bar) (baz . 2)))) (save a-store "/tmp/a-store") ⊣ $3 = #t (load! (make ) "/tmp/a-store" #:no-checks #t) ⊣ $4 = #< 560a1d7aaba0> (inventory a-store) ⊣ $5 = ((foo . bar) (baz . 2)) ... Class, Methods and Procedures ----------------------------- Class, methods and Procedures ----------------------------- -- Class: Slot definition: ‘store’ #:init-keyword #:store #:init-thunk list Note: • when you create a ‘’ instance using the ‘#:store’ #:init-keyword, its value is checked to verify that it is a well-formed store inventory (see *note store-inventory?::). If you wan’t to by-pass these checks, use *note init!:: with ‘#:no-checks’ instead - to be used with caution and at your own risk. • although the store slot also defines a ‘!store’ accessor (not exported and used internally), it is not recommended to use it: instead, use the ‘’ API methods *note inventory::, *note init!:: and *note load!::; -- Method: get (self ) (key ) Returns the SELF (key . value) pair for the given KEY, if it exists. Otherwise, it returns ‘#f’. -- Method: ref (self ) (key ) Returns the SELF value for the given KEY, if it exists. Otherwise, it returns ‘#f’. When the returned value is ‘#f’, it can be either because KEY was not found, or that its value is ‘#f’: if you need to differentiate these cases, use *note get::. -- Method: set-! (self ) (key ) val Returns the SELF store inventory. Either reassociate KEY with VAL if the KEY existed already, or otherwise, add a new ‘(key . val)’ to the SELF store inventory. -- Method: remove! (self ) (key ) Returns the SELF store inventory. Removes the SELF (key . value) pair for the given KEY, if it exists. -- Method: inventory (self ) Returns the SELF store inventory (the content of the SELF store slot). -- Method: init! (self ) vals [#:no-checks #f] Returns SELF. Sets the SELF store inventory to VALS. Unless #:NO-CHECKS is ‘#t’ - to be used with caution and at your own risk - this method calls *note store-inventory?:: and raises an exception if VALS is not a well-formed store inventory. -- Method: load! (self ) filename [#:no-checks #f] Returns SELF. Sets the SELF store inventory to the content of FILENAME. Unless #:NO-CHECKS is ‘#t’ - to be used with caution and at your own risk - this method calls *note store-inventory?:: and raises an exception if the content of FILENAME is not a well-formed store inventory. -- Method: save (self ) filename The return value is unspecified. Saves the store inventory for SELF in FILENAME. -- Procedure: store-inventory? vals Return three values: ‘#t 'well-formed #t’ Everything is fine. ‘#f 'not-a-pair PAIR’ One of the entry is ot a well-formed pair. ‘#f 'wrong-key-type PAIR’ One of the keys was find not to be a symbol. ‘#f 'duplicate-key PAIR’ One of the key has a duplicate entry. A well-formed store inventory is either an empty list or a list of (KEY . VALUE) PAIRs, where KEY is a symbol for all PAIRs and all KEYs are unique. ---------- Footnotes ---------- (1) Strictly speaking, there is no limit on the number of entries a store can handle (appart from available memory size) , but association lists won’t give you decent performance, unless the number of items is kept small: below one hundred entries, it will probably be fine, otherwise you should consider using a real database system instead. (2) Though technically speaking it is possible, as in ‘(slot-set! 'store (acons 'white 'cat (slot-ref 'store)))’ it is not recommended, for two reasons: (a) because you may inadvertently introduce a (KEY . VALUE) pair where KEY would not be a symbol, and (b) because there is much better solution: if that is what you want, then subclass ‘’, for example ‘’ (store - multiple entries) and provide an additional method, for example ‘set-me!’, which, by defintion (Goops (http://www.gnu.org/software/guile/manual/guile.html#GOOPS) generic functions, dispatch mechanism and applicable methods selection), would only work if its key argument is a symbol ... et voilà! 3.8 Iterations ============== Grip module that provides a few more iteration mechanisms, which you may load using: (use-modules (grip iter)) Syntax ------ Syntax ------ -- Syntax: dolist (variable list [result]) body ... Returns RESULT if it is passed, otherwise nothing. Successfully binds VARIABLE to each element of LIST and executes BODY ... (dolist (item '(a b d c) 4) (display item)) ⊣ abcd 4 -- Syntax: dotimes (variable count [result]) body ... Returns RESULT if it is passed, otherwise nothing. Executes BODY ... COUNT times, with VARIABLE successfully binded to each integer in the range ‘[0 (- count 1)]’. (dotimes (i 4) (display i)) ⊣ 0123 3.9 Angles ========== Grip procedures and variables to process angles. The module is loaded by entering the following: (use-modules (grip angle)) Procedures ---------- Variables --------- Procedures ---------- -- Procedure: radian->degree rad -- Procedure: degree-radian deg Returns a number. Converts the radian or degree quantity given by RAD or DEG into degrees or radians respectively. Variables --------- -- Variable: %pi -- Variable: %2pi -- Variable: %pi/2 Respectively defined as ‘(acos -1)’, ‘(* 2 %pi)’ and ‘(/ %pi 2)’. 3.10 Floats =========== Grip procedures and variables to process floats. The module is loaded by entering the following: (use-modules (grip float)) Note that some of the procedures provided by this module (float-zero?, float=? ...) are based on their corresponding ‘quasi’ homonyms provided by ((rnrs arithmetic flonums) :version (6)) (https://www.gnu.org/software/guile/manual/guile.html#rnrs-arithmetic-flonums) (just a question of ‘naming’ convention preferences ... Grip should bind and document all others in the future). Procedures ---------- Procedures ---------- -- Procedure: float-zero? f Returns ‘#t’ if F is zero. Otherwise, it returns ‘#f’. -- Procedure: float=? f1 f2 f3 ... -- Procedure: float? f1 f2 f3 ... -- Procedure: float>=? f1 f2 f3 ... These procedures return ‘#t’ if F1 F2 F3 ... are (respectively) equal, monotonically increasing, monotonically nondecreasing, monotonically decreasing, or monotonically nonincreasing. Otherwise, it returns ‘#f’. -- Procedure: float-round f [n-dec 2] Returns the N-DEC rounded float for F. -- Procedure: float-member f vals Returns the indice of the position of F in VALS if it is found (using *note float=?::). Otherwise it returns ‘#f’. 3.11 REPL Servers ================= Grip procedures that extend Guile’s REPL Servers. The module is loaded by entering the following: (use-modules (grip server)) Procedures ---------- Procedures ---------- -- Procedure: run-server-any-port [#:port 1968] -- Procedure: spawn-server-any-port [#:port 1968] Returns two values, a ‘port’ and a ‘thread’. Starting with #:PORT, incremented by one at each attempt, these procedures search for the first available port value that can be used to create a ‘server-socket’, upon which they call ‘run-server’ or ‘spawn-server’ respectively (see REPL Servers (https://www.gnu.org/software/guile/manual/html_node/Scheme-Write.html#REPL-Servers)), which create and run a REPL, making it available over the given ‘server-socket’. 3.12 Xft ======== Grip procedures to access Xresources ‘XFt’ related informations. The module is loaded by entering the following: (use-modules (grip xft)) This module import and re-export the public interface of the Grip module ‘(grip store)’ (*Note Stores::). Procedures ---------- Procedures ---------- -- Procedure: xft-store [#:default-dpi 96] [#:reload #f] Returns a store. The returned store is made of all Xresources entries having ‘Xft’ as their prefix, and two additional ‘hand made’ entries: ‘'scale-factor’ the ratio between Xft.dpi and default-dpi, rounded to two decimals. ‘'apply-scale-factor?’ set to #f if ’scale-factor is 1.0, #t otherwise. These last two ‘hand made’ xft store entries are (can be) used to appropriately adjust the width and the height of graphics widget, such as GtkText entries, which is, for example, what GNU Foliot (http://www.gnu.org/software/foliot/) does. *note xft-store:: calls the ‘xrdb’ system command. It will raise an error if it can’t find it or the if the following system call returns a non-zero code: ‘"xrdb -query | grep Xft"’. 3.13 Utilities ============== Grip utilities. The module is loaded by entering the following: (use-modules (grip utils)) Procedures and Syntax --------------------- Procedures and Syntax --------------------- -- Procedure: displayln obj [port #f] Returns nothing. Calls ‘display’ and ‘newline’ upon OBJ and PORT if given (see Writing Scheme Values (https://www.gnu.org/software/guile/manual/html_node/Scheme-Write.html#Scheme-Write) in Guile’s manual for a complete description of ‘display’ and the set of options that affect its behavior). -- Procedure: dimfi obj1 obj2 obj3 ... Returns its last argument. ‘dimfi’ works like Guile’s ‘pk’ procedure, except that (a) it does not use ‘extra’ newlines between objects and (b) it only displays two semi-columns at the beginning of each line. If the first argument is a port, then it is used as the output port, otherwise the output is sent to the current output port. -- Procedure: and-l lst Returns #t if every LST element is #t, otherwise it returns #f. It is an error to call ‘and-l’ upon an empty list. -- Syntax: swap! var1 var2 Returns nothing. Swaps the content of VAR1 and VAR2. Appendix A GNU Free Documentation License ***************************************** Version 1.3, 3 November 2008 Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document “free” in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”. Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text. The “publisher” means any person or entity that distributes copies of the Document to the public. A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document’s license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled “History” in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles. You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements.” 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See . Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published on the MMC site. “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. “Incorporate” means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents ==================================================== To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (C) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with...Texts.” line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. Concept Index ************* This index contains concepts, keywords and non-Schemey names for several features, to make it easier to locate the desired sections. * Menu: * copying: Grip License. (line 74) * GPL: Grip License. (line 74) * license: Grip License. (line 74) Procedure Index *************** This is an alphabetical list of all the procedures, methods and macros in Grip. * Menu: * and-l: Utilities. (line 1097) * class-direct-virtual-slots: Goops. (line 432) * class-virtual-slots: Goops. (line 437) * define-method*: Goops. (line 413) * degree-radian: Angles. (line 935) * describe: Goops. (line 443) * describe <1>: Goops. (line 444) * describe <2>: Goops. (line 445) * describe <3>: Goops. (line 446) * describe <4>: Goops. (line 447) * describe <5>: Goops. (line 448) * dimfi: Utilities. (line 1086) * displayln: Utilities. (line 1076) * dolist: Iterations. (line 896) * dotimes: Iterations. (line 907) * flatten: Lists. (line 526) * float-member: Floats. (line 991) * float-round: Floats. (line 987) * float-zero?: Floats. (line 972) * float<=?: Floats. (line 978) * float=?: Floats. (line 980) * float>?: Floats. (line 979) * g-export: Modules. (line 372) * get: Stores. (line 787) * init!: Stores. (line 820) * interleave: Lists. (line 517) * inventory: Stores. (line 815) * list-insert: Lists. (line 501) * list-pos: Lists. (line 496) * list-replace-all: Lists. (line 510) * load!: Stores. (line 829) * module-g-export!: Modules. (line 352) * pop: Queues. (line 698) * pop!: Queues. (line 699) * pop*: Queues. (line 705) * pop*!: Queues. (line 706) * push: Queues. (line 684) * push!: Queues. (line 685) * push*: Queues. (line 691) * push*!: Queues. (line 692) * radian->degree: Angles. (line 934) * re-export-public-interface: Modules. (line 346) * ref: Stores. (line 792) * remove!: Stores. (line 808) * run-server-any-port: REPL Servers. (line 1010) * save: Stores. (line 839) * set-!: Stores. (line 801) * spawn-server-any-port: REPL Servers. (line 1011) * split-keyword-args: Optional Arguments. (line 466) * store-inventory?: Stores. (line 845) * string-contains-ci-ixs: Strings. (line 622) * string-contains-ixs: Strings. (line 609) * string-delete-all: Strings. (line 563) * string-escape: Strings. (line 571) * string-escape-filename: Strings. (line 583) * string-escape-sql: Strings. (line 577) * string-read: Strings. (line 653) * string-replace-all: Strings. (line 555) * string-span: Strings. (line 637) * string-tokens: Strings. (line 596) * strip-keyword-args: Optional Arguments. (line 474) * swap!: Utilities. (line 1103) * xft-store: Xft. (line 1040) Variable Index ************** This is an alphabetical list of all the important variables and constants in Grip. * Menu: * %2pi: Angles. (line 946) * %filename-reserved-chars: Strings. (line 664) * %pi: Angles. (line 945) * %pi/2: Angles. (line 947) Type Index ********** This is an alphabetical list of all the important data types defined in the Grip Programmers Manual. * Menu: * : Stores. (line 765)