-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcall-extended.html
executable file
·350 lines (316 loc) · 14 KB
/
call-extended.html
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
<!DOCTYPE html>
<html lang="en">
<head>
<!--__GOLF_REDIRECT__-->
<title>Call extended</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="HandheldFriendly" content="True"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<link rel="canonical" href="https://golf-lang.com/call-extended.html" />
<style>
body, html {
color:black;
text-rendering: optimizelegibility;
background-color: white;
min-height: 150%;
font-family: "Times New Roman";
font-weight:400;
font-size:18px;
line-height:27px;
letter-spacing: 2px;
z-index: 1;
height: 100%;
text-align:left;
width:80%;
margin-left:auto;
margin-right:auto;
padding:0;
/*font-family: Helvetica, Arial, sans-serif;*/
}
body {
padding-left:1vw;
padding-right:1vw;
}
.ncode {
line-height:20px;
letter-spacing: 0px;
font-size:14px;
font-family: monospace;
display:inline-block;
max-width:100%;
min-width:90%;
margin:0;
padding:0;
padding-left:5px;
padding-top:3px;
padding-bottom:3px;
margin-bottom:15px;
border: 2px solid #d6d6d6;
background-color:#f5f7f4;
white-space:nowrap;
}
.shcode {
line-height:23px;
letter-spacing: 0px;
font-size:14px;
font-family: monospace;
display:inline-block;
max-width:100%;
min-width:90%;
margin:0;
padding:0;
padding-left:5px;
padding-top:3px;
padding-bottom:3px;
margin-bottom:15px;
border: 2px solid #d6d6d6;
background-color:#f5f7f4;
white-space:nowrap;
}
.sqlcode {
line-height:23px;
letter-spacing: 0px;
font-size:14px;
font-family: monospace;
display:inline-block;
max-width:100%;
min-width:90%;
margin:0;
padding:0;
padding-left:5px;
padding-top:3px;
padding-bottom:3px;
margin-bottom:15px;
border: 2px solid #d6d6d6;
background-color:#f5f7f4;
white-space:nowrap;
}
.htmlcode {
line-height:23px;
letter-spacing: 0px;
font-size:14px;
font-family: monospace;
display:inline-block;
max-width:100%;
min-width:90%;
margin:0;
padding:0;
padding-left:5px;
padding-top:3px;
padding-bottom:3px;
margin-bottom:15px;
border: 2px solid #d6d6d6;
background-color:#f5f7f4;
white-space:nowrap;
}
.code {
line-height:23px;
letter-spacing: 0px;
font-size:14px;
font-family: monospace;
display:inline-block;
max-width:100%;
min-width:90%;
margin:0;
padding:0;
padding-left:5px;
padding-top:3px;
padding-bottom:3px;
margin-bottom:15px;
border: 2px solid #d6d6d6;
background-color:#f5f7f4;
white-space:nowrap;
}
/*Just like h1 but for pdf conversion it would be indented this way it's not*/
.vhub {
display: block;
font-size: 1.6em;
margin-top: 0.63em;
margin-bottom: 0.63em;
margin-left: 0;
margin-right: 0;
font-weight: bold;
}
/*Just like h2 but for pdf conversion it would be indented this way it's not*/
.vsub {
display: block;
font-size: 1.25em;
margin-top: 0.53em;
margin-bottom: 0.53em;
margin-left: 0;
margin-right: 0;
font-weight: bold;
}
ul {
margin-left: 0.75vw;
padding-left: 0;
}
li {
margin-left: 0.75vw;
padding-left: 0;
}
/* this must be last, as it overrides previous settings, for mobile */
@media (hover: none) {
a {
display: inline-block;
padding-top: 3px;
padding-bottom: 2px;
}
body {
padding-left:2vw;
padding-right:2vw;
font-size:14px;
line-height:22px;
letter-spacing: 1px;
}
}
/*The following is for code snippets that are highlighted by 2html vim*/
pre { overflow-x: scroll; margin:0; padding:0; font-family:monospace; }
.Identifier { color: #008b8b; }
.Statement { color: #af5f00; }
.PreProc { color: #5fd7ff; }
.Type { color: #005f00; }
.Comment { color: blue ; }
.Constant { color: #ff00ff; }
/*end of highlighted snippets*/
a {
text-decoration:none;
padding-bottom: 0px;
color:inherit;
border-bottom: 2px solid #6cb8f0;
}
a:hover {
text-decoration: none;
color:black;
border-bottom: 1px solid red;
}
/*do not underline links nor should they be active*/
pre a {
text-decoration:none;
color:black;
border-bottom: none;
pointer-events: none;
cursor: default;
}
.golfSnippet {display:none;}
ul {
list-style-type:square;
list-style-position: outside;
}
</style>
</head>
<body>
<script>
function gg_copy(gt, eid, gc) {
gt.textContent = eid.textContent;
gt.select();
document.execCommand("copy");
gc.style.visibility="visible"
setTimeout(()=>{ gc.style.visibility="hidden"; }, 1000);
}
</script>
<!--GOLFMENU13-->
<!--GOLFENDMENU13-->
<!--BEGVDOC90-->
<div class='vhub' style='margin-top:10px;margin-right:20px;text-align:right;background-color:white;'><a href='https://golf-lang.com' style='border-bottom:0px'><img src='https://golf-lang.com/golf.png'/></a></div><div class='vhub' style='margin-top:10px;'> Call extended</div><hr/><span style="font-weight:bold;">Purpose</span>: Call external function or macro (extended mode only).<br/>
<br/>
<div class='code' style='position:relative;padding-right:16px;'>
<pre id='code_266'>
<span class="Statement"> call-extended</span> <function> <span class="Constant">"( "</span> [ & ]<variable> [ , ... ] <span class="Constant">" )"</span></pre>
<span id=golf_copied_266 style='position:absolute;right:-14px;top:-30px; cursor: pointer;visibility:hidden;background:white;'>Copied!</span>
<textarea id='golft_266' style='position: absolute;left: -500%;'></textarea>
<img src='https://golf-lang.com/golf-copy-small-1.png' id='golfb' onclick='gg_copy(golft_266, code_266, golf_copied_266)' style='position:absolute;right:0;top:0; cursor: pointer;opacity:0.5;'/>
</div><br/>
call-extended calls <function> (which can be a function or macro) with a list of parameter variables. The <function> is defined either in:<br/>
<ul><li>a library with C interop - note that such library can be written in many different languages. Most compiled languages can produce such libraries (such as Rust, C/C++ and others),<br/>
</li><li>a ".c" file residing in the directory that contains application source code - again such a C file can in turn call code from libraries produced by any language that supports C interop (most do).<br/>
</li><li>if a macro, in a ".h" file residing in the directory that contains application source code.</li></ul>
The <function> must be declared via C-style declaration in a ".h" file residing in the application source code directory. You can use "--lflag" and "--cflag" options of <a href='https://golf-lang.com/gg.html'>gg</a> to supply libraries used. In addition, if you need to, you can also have any number of ".c" and ".h" files which will be automatically included in your project. A macro must be defined in ".h" file.<br/>
<br/>
call-extended statement can only be used in extended mode (see <a href='https://golf-lang.com/extended-mode.html'>extended-mode</a>). By default, Golf code runs in safe mode which does not allow use of call-extended statement. Note that using call-extended statement does not automatically make your application unsafe; rather, extended code can be written in a memory-safe language (such as Rust), or even if written in C it can be made in such a way not to cause out-of-band memory reads and writes. <br/>
<div class="vsub"><a id="C signature, input/output variables, types"></a>C signature, input/output variables, types</div>
Each <variable> can be of C type (or a pointer to C type):<br/>
<ul><li>"gg_num" which is a signed integer 8 bytes in length (int64_t type). This represents Golf number.<br/>
</li><li>"char *" which is a pointer to an array of characters. This represents Golf string value.<br/>
</li><li>"bool" which is a boolean variable. This represents Golf boolean.</li></ul>
A <function> should not return a value. Rather, use a variable passed as a pointer if you wish to pass the function's output back to your Golf code.<br/>
<div class="vsub"><a id="Web framework for C programming language"></a>Web framework for C programming language</div>
Note that when you use call-extended, Golf becomes a <a href='https://golf-lang.com/web-framework-for-C-programming-language.html'>web-framework-for-C-programming-language</a>.<br/>
<div class="vsub"><a id="Examples"></a>Examples</div>
For instance, consider C file "calc.c":<br/>
<div class='code' style='position:relative;padding-right:16px;'>
<pre id='code_267'>
<span class="PreProc">#include </span><span class="Constant">"golf.h"</span>
<span class="Comment">// Compute factorial of f, and store result into res</span>
<span class="Type">void</span> factorial(gg_num f, gg_num *res)
<span class="Statement"> {</span>
*res = <span class="Constant">1</span>;
gg_num i;
<span class="Statement">for</span> (i = <span class="Constant">2</span>; i <= f; i++) {
*res *= i;
<span class="Statement"> }</span>
<span class="Statement"> }</span></pre>
<span id=golf_copied_267 style='position:absolute;right:-14px;top:-30px; cursor: pointer;visibility:hidden;background:white;'>Copied!</span>
<textarea id='golft_267' style='position: absolute;left: -500%;'></textarea>
<img src='https://golf-lang.com/golf-copy-small-1.png' id='golfb' onclick='gg_copy(golft_267, code_267, golf_copied_267)' style='position:absolute;right:0;top:0; cursor: pointer;opacity:0.5;'/>
</div><br/>
Declare this C function in a header file, for instance "calc.h":<br/>
<div class='code' style='position:relative;padding-right:16px;'>
<pre id='code_268'>
<span class="Type">void</span> factorial(gg_num f, gg_num *res);</pre>
<span id=golf_copied_268 style='position:absolute;right:-14px;top:-30px; cursor: pointer;visibility:hidden;background:white;'>Copied!</span>
<textarea id='golft_268' style='position: absolute;left: -500%;'></textarea>
<img src='https://golf-lang.com/golf-copy-small-1.png' id='golfb' onclick='gg_copy(golft_268, code_268, golf_copied_268)' style='position:absolute;right:0;top:0; cursor: pointer;opacity:0.5;'/>
</div><br/>
You can also have macros in a header file, so for example "calc.h" could be:<br/>
<div class='code' style='position:relative;padding-right:16px;'>
<pre id='code_269'>
<span class="Type">void</span> factorial(gg_num f, gg_num *res);
<span class="PreProc">#</span>define<span class="PreProc"> </span>mod10<span class="PreProc">(n, m) m=(n)%</span><span class="Constant">10</span></pre>
<span id=golf_copied_269 style='position:absolute;right:-14px;top:-30px; cursor: pointer;visibility:hidden;background:white;'>Copied!</span>
<textarea id='golft_269' style='position: absolute;left: -500%;'></textarea>
<img src='https://golf-lang.com/golf-copy-small-1.png' id='golfb' onclick='gg_copy(golft_269, code_269, golf_copied_269)' style='position:absolute;right:0;top:0; cursor: pointer;opacity:0.5;'/>
</div><br/>
In this case you have defined a macro that calculates the moduo of 10 and stores a result into another variable.<br/>
<br/>
Use these in your Golf code with call-extended statement, for instance to use a function "factorial()":<br/>
<div class='code' style='position:relative;padding-right:16px;'>
<pre id='code_270'>
<span class="Statement"> extended-mode</span>
<span class="Statement"> begin-handler</span> /fact<span class="Identifier"> public</span>
<span class="Statement"> set-number</span> fact
<span class="Statement"> call-extended</span> factorial (<span class="Constant">10</span>, &fact)
<span class="Statement"> p-num</span> fact
<span class="Statement"> end-handler</span></pre>
<span id=golf_copied_270 style='position:absolute;right:-14px;top:-30px; cursor: pointer;visibility:hidden;background:white;'>Copied!</span>
<textarea id='golft_270' style='position: absolute;left: -500%;'></textarea>
<img src='https://golf-lang.com/golf-copy-small-1.png' id='golfb' onclick='gg_copy(golft_270, code_270, golf_copied_270)' style='position:absolute;right:0;top:0; cursor: pointer;opacity:0.5;'/>
</div><br/>
In the above example, number "fact" is passed by reference (as a pointer), and it will contain the value of factorial of 10 on return. The result printed out is "3628800".<br/>
<br/>
To use macro "mod10()":<br/>
<div class='code' style='position:relative;padding-right:16px;'>
<pre id='code_271'>
<span class="Statement"> extended-mode</span>
<span class="Statement"> begin-handler</span> /mod<span class="Identifier"> public</span>
<span class="Statement"> set-number</span> mod
<span class="Statement"> call-extended</span> mod10(<span class="Constant">103</span>, mod)
<span class="Statement"> p-num</span> mod
<span class="Statement"> end-handler</span></pre>
<span id=golf_copied_271 style='position:absolute;right:-14px;top:-30px; cursor: pointer;visibility:hidden;background:white;'>Copied!</span>
<textarea id='golft_271' style='position: absolute;left: -500%;'></textarea>
<img src='https://golf-lang.com/golf-copy-small-1.png' id='golfb' onclick='gg_copy(golft_271, code_271, golf_copied_271)' style='position:absolute;right:0;top:0; cursor: pointer;opacity:0.5;'/>
</div><br/>
In this example, you are using a C macro, so number "fact" is assigned a value directly, per C language rules. The result printed out is "3".<br/>
<div class="vsub"><a id="See also"></a>See also</div>
<a name='C language'></a><span style="font-weight:bold;">C language</span><br/>
<a href='https://golf-lang.com/call-extended.html'>call-extended</a> <br/>
<a href='https://golf-lang.com/extended-mode.html'>extended-mode</a> <br/>
<a href='https://golf-lang.com/web-framework-for-C-programming-language.html'>web-framework-for-C-programming-language</a> <br/>
<span style="font-weight:bold;">See all</span> <br/>
<a href='https://golf-lang.com/documentation.html'>documentation</a><br/>
<!--ENDVDOC90-->
<br/><div style='width:100%;clear:both;'>
<hr/>
<!--GOLFFOOT77--><span style='font-size:80%'><a href="https://golf-lang.com/copyright.html">Copyright</a> (c) 2019-2025 Gliim LLC. All contents on this web site is "AS IS" without warranties or guarantees of any kind.</span>
</div><br/></body></html>