[예제]
--lexical scoping
--1급 : first class citizen
-- 1급 : 객체나 값 또는 어떤 기능 요소가 매개변수로 전달 가능하고 반환 가능하며 변수에 할당도 가능한 경우(실행 시간에 코드로 다룰 수 있는 것)
-- 2급 : 매개변수로는 전달 가능하자 반환과 할당을 할 수 없는 경우
-- 3급 : 매개변수 전달도 불가능
-- 함수형 언어(Function programming)
--a = {p = print}
--a.p("hello world")
--print = math.sin
--a.p(print(1)) -- equal a.p(math.sin(1))
--sin = a.p
--sin(10, 20) --equal a.p(10, 20) -> print(10, 20)
--sort
network = {
{name = "grauna", IP = "210.26.30.34"},
{name = "arraial", IP = "210.26.30.23"},
}
table.sort(network, function(a,b) return (a.name > b.name) end)
--고차 함수 : 다른 함수를 인자로 받는 함수
function derivative(f, delta)
delta = delta or 1e-4
return function(x)
return (f(x+delta) - f(x))/delta
end
end
c = derivative(math.sin)
print(math.cos(5.2), c(5.2))
print(math.cos(10), c(10))
names = {"Peter", "Paul", "Mary"}
grades = {Mary = 10, Paul = 7, Peter = 8}
print(names[1], names[2], names[3])
table.sort(names, function(n1,n2)
return grades[n1]>grades[n2]
end)
function sortbygrade (names, grades)
table.sort(names, function(n1, n2)
return grades[n1]>grades[n2]
end)
end
print(names[1], names[2], names[3])
--Closer, 정적 범위 지정. 함수 안의 함수에서 지역 변수를 공유한다.
function newCounter()
local i = 0
return function()
i = i +1
return i
end
end
c1 = newCounter()
print("c1:", c1())
print("c1:", c1())
c2 = newCounter()
print("c2:", c2())
print("c1:", c1())
print("c2:", c2())
function digitButtion(digit)
return Button{label = tostring(digit),
action = function()
add_to_display(digit)
end
}
end
--[[
oldSin = math.sin
math.sin = function(x)
return oldSin(x*math.pi/180)
end
--]]
oldSin = math.sin
do
local oldSin2 = math.sin
local k = math.pi/180
math.sin = function(x)
return oldSin2(x*k)
end
end
print(oldSin(math.pi/2)) --radian
print(math.sin(90)) --degree
-- secure environment
do
local oldOpen = io.open
local access_OK = function(filename, mode)
--access check
end
io.open = function(filename, mode)
if access_OK(filename, mode) then
return oldOpen(filename, mode)
else
return nil, "access denied"
end
end
end
Lib = {}
Lib.foo = function (x,y) return x+y end
Lib.goo = function (x,y) return x-y end
print(Lib.foo(2,3), Lib.goo(2,3))
Lib2 = {
foo2 = function (x,y) return x+y end,
goo2 = function (x,y) return x-y end
}
Lib3 = {}
function Lib3.foo(x,y) return x+y end
function Lib3.goo(x,y) return x-y end
local f = function(params)
--body
end
local g = function(params)
--body
f()
--body
end
local fact
fact = function(n)
if n == 0 then return 1
else return n*fact(n-1)
end
end
--local foo; foo = function(params) body end
local ff, gg --forward declaration
function gg()
ff()
end
function ff()
gg()
end
[결과]
0.46851667130038 0.46856084325086
-0.83907152907645 -0.83904432662041
Peter Paul Mary
Mary Peter Paul
c1: 1
c1: 2
c2: 1
c1: 3
c2: 2
1
1
5 -1
--lexical scoping
--1급 : first class citizen
-- 1급 : 객체나 값 또는 어떤 기능 요소가 매개변수로 전달 가능하고 반환 가능하며 변수에 할당도 가능한 경우(실행 시간에 코드로 다룰 수 있는 것)
-- 2급 : 매개변수로는 전달 가능하자 반환과 할당을 할 수 없는 경우
-- 3급 : 매개변수 전달도 불가능
-- 함수형 언어(Function programming)
--a = {p = print}
--a.p("hello world")
--print = math.sin
--a.p(print(1)) -- equal a.p(math.sin(1))
--sin = a.p
--sin(10, 20) --equal a.p(10, 20) -> print(10, 20)
--sort
network = {
{name = "grauna", IP = "210.26.30.34"},
{name = "arraial", IP = "210.26.30.23"},
}
table.sort(network, function(a,b) return (a.name > b.name) end)
--고차 함수 : 다른 함수를 인자로 받는 함수
function derivative(f, delta)
delta = delta or 1e-4
return function(x)
return (f(x+delta) - f(x))/delta
end
end
c = derivative(math.sin)
print(math.cos(5.2), c(5.2))
print(math.cos(10), c(10))
names = {"Peter", "Paul", "Mary"}
grades = {Mary = 10, Paul = 7, Peter = 8}
print(names[1], names[2], names[3])
table.sort(names, function(n1,n2)
return grades[n1]>grades[n2]
end)
function sortbygrade (names, grades)
table.sort(names, function(n1, n2)
return grades[n1]>grades[n2]
end)
end
print(names[1], names[2], names[3])
--Closer, 정적 범위 지정. 함수 안의 함수에서 지역 변수를 공유한다.
function newCounter()
local i = 0
return function()
i = i +1
return i
end
end
c1 = newCounter()
print("c1:", c1())
print("c1:", c1())
c2 = newCounter()
print("c2:", c2())
print("c1:", c1())
print("c2:", c2())
function digitButtion(digit)
return Button{label = tostring(digit),
action = function()
add_to_display(digit)
end
}
end
--[[
oldSin = math.sin
math.sin = function(x)
return oldSin(x*math.pi/180)
end
--]]
oldSin = math.sin
do
local oldSin2 = math.sin
local k = math.pi/180
math.sin = function(x)
return oldSin2(x*k)
end
end
print(oldSin(math.pi/2)) --radian
print(math.sin(90)) --degree
-- secure environment
do
local oldOpen = io.open
local access_OK = function(filename, mode)
--access check
end
io.open = function(filename, mode)
if access_OK(filename, mode) then
return oldOpen(filename, mode)
else
return nil, "access denied"
end
end
end
Lib = {}
Lib.foo = function (x,y) return x+y end
Lib.goo = function (x,y) return x-y end
print(Lib.foo(2,3), Lib.goo(2,3))
Lib2 = {
foo2 = function (x,y) return x+y end,
goo2 = function (x,y) return x-y end
}
Lib3 = {}
function Lib3.foo(x,y) return x+y end
function Lib3.goo(x,y) return x-y end
local f = function(params)
--body
end
local g = function(params)
--body
f()
--body
end
local fact
fact = function(n)
if n == 0 then return 1
else return n*fact(n-1)
end
end
--local foo; foo = function(params) body end
local ff, gg --forward declaration
function gg()
ff()
end
function ff()
gg()
end
[결과]
0.46851667130038 0.46856084325086
-0.83907152907645 -0.83904432662041
Peter Paul Mary
Mary Peter Paul
c1: 1
c1: 2
c2: 1
c1: 3
c2: 2
1
1
5 -1
[LUA] Chap6. internal of Function
Reviewed by kukanuc
on
3월 10, 2019
Rating:
댓글 없음: