summaryrefslogtreecommitdiff
path: root/doc/user/prgm.skb
blob: 1007268c819e1ddcc9470a4d23eb7e7a42912368 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
;;; prgm.skb  --  Computer programs
;;;
;;; Copyright 2001, 2002, 2003, 2004  Manuel Serrano
;;;
;;;
;;; This program is free software; you can redistribute it and/or modify
;;; it under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 2 of the License, or
;;; (at your option) any later version.
;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with this program; if not, write to the Free Software
;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
;;; USA.

;*---------------------------------------------------------------------*/
;*    fib ...                                                          */
;*---------------------------------------------------------------------*/
(define (fib x) ;!fib
   (if (< x 2)
       1
       (+ (fib (- x 1)) (fib (- x 2)))))

;*---------------------------------------------------------------------*/
;*    Computer programs                                                */
;*---------------------------------------------------------------------*/
(chapter :title "Computer Programs" 

(p [It is common that some parts of a Skribe text represent other
texts. For instance, for a document describing a computer programming
language, it is frequent to include excerpt of programs. These
embedded texts are frequently displayed in a specific font and with no
justification but with a precise ,(emph "indentation"). This indentation is
important because it helps in understanding the text,(begin ";")
it is thus desirable to preserve it in the Skribe text. The
,(markup-ref "pre") text layout already enables such a
text formating. This chapter presents two new Skribe functions:
,(markup-ref "prog") and ,(markup-ref "source") that is specially 
designed to represent computer programs in Skribe text.])

;*---------------------------------------------------------------------*/
;*    Programs ... @label prog@                                        */
;*---------------------------------------------------------------------*/
(section :title "Program"

(p [A ,(code "prog") function call preserves the indentation of the
program. It may automatically introduce line numbers.])

(doc-markup 'prog
	    `((:line ,[Enables/disables automatic line numbering. An integer
               value enables the line number and specifies the number of
               the first line of the program. A value of ,(code "#f") disables
               the line numbering.])
	      (:linedigit ,[The number of digit for representing line
               numbers.])
	      (:mark ,[A string or the boolean ,(code "#f"). If this option 
               is a string, that string is the prefix 
               of line marks. These marks can be used in the 
               ,(markup-ref "ref") reference. A mark
               identifier is defined by the regular expression:
               ,(code [,(char "[")_a-zA-Z,(char "]"),(char "[")_a-zA-Z0-9,(char "]")*]). The prefix and the mark are removed from the output program.]))
	    :force-engines *api-engines*
	    :see-also '(source pre ref))

(example-produce 
 (example :legend "A program" (prgm :file "src/prgm1.skb"))
 (disp (include "src/prgm1.skb"))))

;*---------------------------------------------------------------------*/
;*    Source code ... @label source@                                   */
;*---------------------------------------------------------------------*/
(section :title "Source code"

(p [The ,(code "source") function extracts part of the source code and
enables ,(emph "fontification"). That is, some words of the program
can be rendered using different colors or faces.])

;!source-start
(doc-markup 'source
	    `((:language ,[The ,(markup-ref "language") of the source code.])
	      (:file ,[The file containing the actual source code. The file
               is searched in the ,(markup-ref "skribe-source-path") path.])
	      (:start [A start line number or a start marker.])
	      (:stop [A stop line number or a stop marker.])
	      (:definition [The identifier of the definition to extract.])
	      (:tab [The tabulation width.]))
	    :common-args '()
	    :force-engines *api-engines*
	    :see-also '(prog language ref skribe-source-path))
;!source-stop
   
(example-produce 
 (example :legend "The source markup" (prgm :file "src/prgm2.skb"))
 (disp (include "src/prgm2.skb"))))

;*---------------------------------------------------------------------*/
;*    Language ... @label language@                                    */
;*---------------------------------------------------------------------*/
(section :title "Language"
(index "source" :note "fontification")
(index "fontification")

(p [The ,(code "language") function builds a language that can be used
in ,(markup-ref "source") function call.])

(doc-markup 'language
	    `((:name [A string which denotes the name of the language.])
	      (:fontifier [A function of one argument (a string), that
               colorizes a line source code.])
	      (:extractor [A function of three arguments: an input port,
               an identifier, a tabulation size. This function ,(emph "scans")
               in the input port the definition is looks for.]))
	    :common-args '()
	    :force-engines *api-engines*
	    :see-also '(prog source ref))

; **** FIXME:
(cond-expand
   (bigloo
    (example-produce 
     (example :legend "An ad-hoc fontification"
	      (prgm :file "src/prgm3.skb"))
     (disp (include "src/prgm3.skb"))))
   (else
    '()))))