环/教程/函数式编程
外观
< 环
在之前的章节中,我们学习了函数和递归。
在本章中,我们将学习更多函数式编程 (FP) 概念,例如
- 纯函数
- 一等函数
- 高阶函数
- 匿名函数和嵌套函数。
- 函数的相等性
我们可以通过赋值运算符按值复制变量(列表和对象)来创建纯函数(不改变状态的函数),而不是通过引用操作传递给函数的原始数据。
示例
Func Main
aList = [1,2,3,4,5]
aList2 = square(aList)
see "aList" + nl
see aList
see "aList2" + nl
see aList2
Func Square aPara
a1 = aPara # copy the list
for x in a1
x *= x
next
return a1 # return new list
输出
aList
1
2
3
4
5
aList2
1
4
9
16
25
环编程语言中的函数是一等公民,您可以将函数作为参数传递,将它们作为返回值,或者将它们存储在变量中。
我们可以通过键入函数名称作为文字(例如“FunctionName”)或 :FunctionName 来传递/返回函数。
我们可以使用包含函数名称的变量来传递/返回函数。
我们可以使用 Call 命令从包含函数名称的变量中调用函数。
语法
Call Variable([Parameters])
示例
Func Main
see "before test2()" + nl
f = Test2(:Test)
see "after test2()" + nl
call f()
Func Test
see "Message from test!" + nl
Func Test2 f1
call f1()
See "Message from test2!" + nl
return f1
输出
before test2()
Message from test!
Message from test2!
after test2()
Message from test!
高阶函数是将其他函数作为参数的函数。
示例
Func Main
times(5,:test)
Func Test
see "Message from the test function!" + nl
Func Times nCount,F
for x = 1 to nCount
Call F()
next
输出
Message from the test function!
Message from the test function!
Message from the test function!
Message from the test function!
Message from the test function!
匿名函数是无名的函数,可以作为参数传递给其他函数或存储在变量中。
语法
Func [Parameters] { [statements] }
示例
test( func x,y {
see "hello" + nl
see "Sum : " + (x+y) + nl
} )
new great { f1() }
times(3, func { see "hello world" + nl } )
func test x
call x(3,3)
see "wow!" + nl
func times n,x
for t=1 to n
call x()
next
Class great
func f1
f2( func { see "Message from f1" + nl } )
func f2 x
call x()
输出
hello
Sum : 6
wow!
Message from f1
hello world
hello world
hello world
示例
Func Main
aList = [1,2,3,4]
Map (aList , func x {
return x*x
} )
see aList
aList = [4,9,14,25]
Map(aList, :myfilter )
see aList
aList = [11,12,13,14]
Map (aList , func x {
if x%2=0
return "even"
else
return "odd"
ok
})
see aList
Func myfilter x
if x = 9
return "True"
else
return "False"
ok
Func Map aList,cFunc
for x in aList
x = call cFunc(x)
next
输出
1
4
9
16
False
True
False
False
odd
even
odd
even
我们可以使用 '=' 或 '!=' 运算符测试函数是否相等。
示例
f1 = func { see "hello" + nl }
f2 = func { see "how are you?" + nl }
f3 = f1
call f1()
call f2()
call f3()
see (f1 = f2) + nl
see (f2 = f3) + nl
see (f1 = f3) + nl
输出
hello
how are you?
hello
0
0
1