Elements of Programming - Coursera 강의 ppt 번역

2015. 12. 23. 11:42Programming/Scala

Elements of Programming


대다수의 중요한 programming 언어에서는 아래의 요소들을 제공한다.


- 가장 단순한 element를 표현할 수 있는 기본 표현법

- 표현을 결합하기 위한 방법들

- 추상 표현을 하기 위한 방법들


The Read-Eval-Print Loop


Functional programming은 계산기의 사용과 약간 비슷하다. 

interactive shell(REPL <Read-Eval-Print-Loop>)은 표현을 쓰고 값을 리턴할 수 있게 해준다.

Scala REPL은 단순하게 타이핑 함으로써 시작할 수 있다.


> scala


Expressions


아래 예제는 REPL을 이용하여 interaction하는 단순한 방법이다.


scala> 87 + 145

232


Functional programming language는 계산기보다 더 단순하게 사용이 가능하다. 왜냐하면 값과 함수들을 정의할 수 있기 때문이다.


scala> def size = 2

size: => Int

scala> 5* size

10


Evaluation


expression은 아래의 방법으로 평가된다.


- 가장 왼쪽 연산자를 가져온다.

- 연산자의 피연산자를 평가한다.

- 연산자를 피연산자에 적용한다.


Example


(2 * pi) * radius

(2 * 3.14159) * radius

6.28318 * radius

6.28318 * 10

62.8318


Parameters


아래와 같이 함수 정의 시 파라미터를 가질 수 있다.


scala> def square(x: Double) = x * x

square: (Double)Double

scala> square(2)

4.0

scala> square(5+4)

81.0

scala> square(square(4))

256.0


def sumOfSquares(x: Double, y: Double) = square(x) + square(y)

sumOfSquares: (Double, Double)Double


Parameter and Return Types


콜론 이후에 파라미터의 타입을 기입한다.


def power(x: Double, y: Int): Double = ...


대부분 Java의 타입을 따르지만 아래와 같이 첫번째 알파벳을 대문자로 표기한다.

- Int      : 32-bit integers

- Double : 64-bit floating point numbers

- Boolean : boolean values true and false


Evaluation of Function Application


파라미터화된 function은 operator와 유사한 방식으로 평가된다.


1. 모든 함수 arguments를 왼쪽에서 오른쪽으로 평가한다.

2. Replace the function application by the function's right-hand size, and, at the same time

3. 실제 argument에 의해 함수의 파라미터를 변경한다.


Example


sumOfSquares(3, 2+2)

sumOfSquares(3, 4)

square(3) + square(4)

3 * 3 + square(4)

9 + suqare(4)

9 + 4 * 4

9 + 16

25


The substitution model


- 위의 예제에서와 같은 표현식을 substitution model이라고 부른다.

- 기본 원리는 모든 평가가 표현을 값으로 줄여나가는 것이다.

- 모든 표현에 적용시킬 수가 있으며, 부작용 또한 없다.


Changing the evaluation strategy


interpreter는 함수를 다시 쓰기 전에 함수의 argument를 값으로 줄이는 작업을 한다. 또 다른 방법으로는 argument를 줄이지 않는 방법이 있다.

예를 들어, 

sumOfSquares(3, 2 + 2)

square(3) + square(2 + 2)

3 * 3 + square(2 + 2)

9 + square(2 + 2)

9 + (2 + 2) * (2 + 2)

9 + 4 * (2 + 2)

9 + 4 * 4

25


Call-by-name and call-by-value


첫 번째 평가 전략은 call-by-value이고 두 번째는 call-by-name이다.

두 개의 전략 모두 동일한 값을 생성하며, 순수 함수들로 표현식이 구성되어 있고, 평가가 종료된다는 공통점이 있다.

하지만 call-by-value 같은 경우는 모든 함수 argument가 즉시 한 번에 평가되는 반면에, call-by-name은 파라미터가 만약 사용되지 않는다면 평가되지 않는 장점을 가지고 있다.