Skip to content

Instantly share code, notes, and snippets.

@masutaka
Last active October 27, 2017 09:10
Show Gist options
  • Save masutaka/9ee748e148f89f85d4f1e4e8ef319ea8 to your computer and use it in GitHub Desktop.
Save masutaka/9ee748e148f89f85d4f1e4e8ef319ea8 to your computer and use it in GitHub Desktop.
Closure sample of clang and golang
/* Closure sample */
#include <stdio.h>
typedef int anyFunc(void);
static int doTimes(anyFunc anything, int n);
int main(void)
{
int number1 = 0;
int increment1(void)
{
return ++number1;
}
int number2 = 0;
int increment2(void)
{
return ++number2;
}
printf("--- part1 ---\n");
printf("number1: %d\n\n", number1);
/* => 0 */
increment1();
printf("number1: %d\n\n", number1);
/* => 1 */
increment1();
printf("number1: %d\n\n", number1);
/* => 2 */
increment1();
printf("number1: %d\n\n", number1);
/* => 3 */
printf("\n");
printf("--- part2 ---\n");
printf("number2: %d\n\n", number2);
/* => 0 */
printf("doTimesResult: %d\n", doTimes(increment2, 1));
printf("number2: %d\n\n", number2);
/* => 1 */
printf("doTimesResult: %d\n", doTimes(increment2, 3));
printf("number2: %d\n\n", number2);
/* => 4 */
printf("doTimesResult: %d\n", doTimes(increment2, 5));
printf("number2: %d\n\n", number2);
/* => 9 */
printf("\n");
return 0;
}
static int doTimes(anyFunc* anything, int n)
{
int i, lastNumber;
for (i = 0; i < n; i++) {
lastNumber = anything();
}
return lastNumber;
}
// Closure sample
package main
import "fmt"
type anyFunc func() int
func main() {
fmt.Printf("--- part1 ---\n")
increment1 := getIncrementFunc()
fmt.Printf("number: %d\n\n", increment1())
// => 1
fmt.Printf("number: %d\n\n", increment1())
// => 2
fmt.Printf("number: %d\n\n", increment1())
// => 3
fmt.Printf("\n")
fmt.Printf("--- part2 ---\n")
increment2 := getIncrementFunc()
fmt.Printf("doTimesResult: %d\n\n", doTimes(increment2, 1))
// => 1
fmt.Printf("doTimesResult: %d\n\n", doTimes(increment2, 3))
// => 4
fmt.Printf("doTimesResult: %d\n\n", doTimes(increment2, 5))
// => 9
}
func getIncrementFunc() anyFunc {
var number int
return func() int {
number++
return number
}
}
func doTimes(anything anyFunc, n int) int {
var lastNumber int
for i := 0; i < n; i++ {
lastNumber = anything()
}
return lastNumber
}
@masutaka
Copy link
Author

main.c requires not LLVM clang but gcc.

@masutaka
Copy link
Author

main.c

$ gcc main.c
$ ./a.out
--- part1 ---
number1: 0

number1: 1

number1: 2

number1: 3


--- part2 ---
number2: 0

doTimesResult: 1
number2: 1

doTimesResult: 4
number2: 4

doTimesResult: 9
number2: 9

main.go

% go run main.go
--- part1 ---
number: 1

number: 2

number: 3


--- part2 ---
doTimesResult: 1

doTimesResult: 4

doTimesResult: 9

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment