Skip to content

Instantly share code, notes, and snippets.

@mflamer
Created September 1, 2013 00:12
Show Gist options
  • Save mflamer/6401476 to your computer and use it in GitHub Desktop.
Save mflamer/6401476 to your computer and use it in GitHub Desktop.
Experimenting with some functional programming concepts in Nimrod
#------Generic Tuples
type
Tup2[T1,T2] = tuple[x1:T1, x2:T2]
Tup3[T1,T2,T3] = tuple[x1:T1, x2:T2, x3:T3]
Tup4[T1,T2,T3,T4] = tuple[x1:T1, x2:T2, x3:T3, x4:T4]
Tup5[T1,T2,T3,T4,T5] = tuple[x1:T1, x2:T2, x3:T3, x4:T4, x5:T5]
#-------Function Composition
proc `&`[T1,T2,T3](g:proc(y:T2):T3, f:proc(x:T1):T2):proc(z:T1):T3 =
result = proc(x:T1):T3 = g(f(x))
#-------Partial Application
#---1 Arg
proc `$|`[T1,T2](f:proc(a:T1):T2, x1:T1):T2 {.inline.} = f(x1)
#---2 Arg
proc `$|`[T1,T2,T3](f:proc(a:T1,b:T2):T3, x1:T1):auto {.inline.} =
result = proc(x2:T2):T3 = f(x1,x2)
proc `$|`[T1,T2,T3](f:proc(a:T1,b:T2):T3, t:Tup2[T1,T2]):auto {.inline.} =
result = f(t[0],t[1])
#---3 Arg
proc `$|`[T1,T2,T3,T4](f:proc(a:T1,b:T2,c:T3):T4, x1:T1):auto {.inline.} =
result = proc(x2:T2, x3:T3):T4 = f(x1,x2,x3)
proc `$|`[T1,T2,T3,T4](f:proc(a:T1,b:T2,c:T3):T4, t:Tup2[T1,T2]):auto {.inline.} =
result = proc(x3:T3):T4 = f(t[0],t[1],x3)
proc `$|`[T1,T2,T3,T4](f:proc(a:T1,b:T2,c:T3):T4, t:Tup3[T1,T2,T3]):auto {.inline.} =
f(t[0],t[1],t[2])
#---4 Arg
proc `$|`[T1,T2,T3,T4,T5](f:proc(a:T1,b:T2,c:T3,d:T4):T5, x1:T1):auto =
result = proc(x2:T2,x3:T3,x4:T4):T5 = f(x1,x2,x3,x4)
proc `$|`[T1,T2,T3,T4,T5](f:proc(a:T1,b:T2,c:T3,d:T4):T5, t:Tup2[T1,T2]):auto {.inline.} =
result = proc(x3:T3,x4:T4):T5 = f(t[0],t[1],x3,x4)
proc `$|`[T1,T2,T3,T4,T5](f:proc(a:T1,b:T2,c:T3,d:T4):T5, t:Tup3[T1,T2,T3]):auto {.inline.} =
result = proc(x4:T4):T5 = f(t[0],t[1],t[2],x4)
proc `$|`[T1,T2,T3,T4,T5](f:proc(a:T1,b:T2,c:T3,d:T4):T5, t:Tup4[T1,T2,T3,T4]):auto {.inline.} =
f(t[0],t[1],t[2],t[3])
#---5 Arg
proc `$|`[T1,T2,T3,T4,T5,T6](f:proc(a:T1,b:T2,c:T3,d:T4,e:T5):T6, x1:T1):auto =
result = proc(x2:T2,x3:T3,x4:T4,x5:T5):T6 = f(x1,x2,x3,x4,x5)
proc `$|`[T1,T2,T3,T4,T5,T6](f:proc(a:T1,b:T2,c:T3,d:T4,e:T5):T6, t:Tup2[T1,T2]):auto {.inline.} =
result = proc(x3:T3,x4:T4,x5:T5):T6 = f(t[0],t[1],x3,x4,x5)
proc `$|`[T1,T2,T3,T4,T5,T6](f:proc(a:T1,b:T2,c:T3,d:T4,e:T5):T6, t:Tup3[T1,T2,T3]):auto {.inline.} =
result = proc(x4:T4,x5:T5):T6 = f(t[0],t[1],t[2],x4,x5)
proc `$|`[T1,T2,T3,T4,T5,T6](f:proc(a:T1,b:T2,c:T3,d:T4,e:T5):T6, t:Tup4[T1,T2,T3,T4]):auto {.inline.} =
result = proc(x5:T5):T6 = f(t[0],t[1],t[2],t[3],x5)
proc `$|`[T1,T2,T3,T4,T5,T6](f:proc(a:T1,b:T2,c:T3,d:T4,e:T5):T6, t:Tup5[T1,T2,T3,T4,T5]):auto {.inline.} =
f(t[0],t[1],t[2],t[3],t[4])
@mflamer
Copy link
Author

mflamer commented Sep 1, 2013

I'd like to take partial application up to 10 parameters,but sees like a macro would save some typing...

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