-
Notifications
You must be signed in to change notification settings - Fork 0
/
lambda.h
84 lines (78 loc) · 2.17 KB
/
lambda.h
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
/**
* ---
* section: Functional
* title: Lambda
* short_description: a module for anonymous functions called lambda
*
* file: lambda.h
* license: MPL 2.0
* copyright: RickBarretto, 2023
* version: 1.0.0
* ---
*
* <!-- read the footer for more information about copyright -->
*
* ## Description
*
* This module provides you a sugar-syntax for GCC's anonymous functions.
*
* ## Design Choices
*
* There are a few alternatives names for lambda, they are: ʄ and ʎ.
* I added this for the case where the user wants to use a shorter name,
* since the C's syntax does not helps so much with that...
*
*/
#ifndef LIB_LAMBDA_H
#define LIB_LAMBDA_H
#if !defined(__GNUC__)
#error "You need GCC compiler to use this module"
#endif
#define macro_var(var) var##_##__LINE__
/** ## lambda
*
* > lambda(type, args, body)
* > type: macro
*
* > **Note**: it's not C compilant, but GCC compilant,
* > it's currently using two extended features from GCC:
* > - nested functions
* > - statement expressions
*
* Syntax-sugar for GCC's anonymous functions.
*
* - type: the returned type
* - args: the arguments, enclosed by parentesis (`()`)
* - note that colon (`,`) is needed between parameters.
* - body: the body of the function, enclosed by curly braces (`{}`)
* - note that you must use semi-colon (`;`) for each statement
* and may need use `return` if some value is returned.
*
* ### Alternative names
* - ʄ
* - ʎ
*
* ### Usage
*
* ```c
* int max = lambda(int, (int a, int b), { return (a > b)? a:b; });
* int max = ʄ(int, (int a, int b), { return (a > b)? a:b; });
* int max = ʎ(int, (int a, int b), { return (a > b)? a:b; });
* ```
*/
#define lambda(type, args, body) \
({ \
type macro_var(lambda) args \
body macro_var(lambda); \
})
#define \u0284 lambda /* ʄ */
#define \u028E lambda /* ʎ */
#endif /* LAMBDA_H */
/**
* Copyright (C) 2023 RickBarretto
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
*/