[LUA] Chap6. internal of Function

[예제]

--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 [LUA] Chap6. internal of Function Reviewed by kukanuc on 3월 10, 2019 Rating: 5

댓글 없음:

Powered by Blogger.