Clojure in Action Ch. 1

by Amit Rathore

Preface

복잡성의 두가지
Essential complexity : 원래 복잡한 것.
Accidental complexity : 문제 외의 영역에서 초래된 복잡성.

Chapter 1. Introduction to Clojure

1.1 What is Clojure

1.1.1 Clojure – the reincarnation of Lisp

리스프의 환생.

1.1.2 How we got here

LISt Processing : LISP. 1958년에 설계된 언어.
“code as data” 의 개념.  70~80년대에 인공지능에 많은 투자가 이뤄졌지만, 대부분 실패. 그 오명을 리스프가 지게 됨.
JVM 위의 리슾 개념 : JScheme, Kawa, ABCL  등등.  하지만, 실용적으로 유용한 건 없었슴.
Rich Hickey : 창조자. 는 굉장한 일을 하였다.
클로져는 마침내 살아남은 리슾이 되었다.  –> 리슾의 미래이자 동적 프로그램 언어의 미래.

1.1.3 How this book teaches Clojure

이 책의 철학은 두 기둥에 놓여있다.
> 클로져의 첫번째 원칙을 강조하는 것.
> 그리고, 이러한 원리를 이해하기 위한 실용적인 접근.
많은 코드를 통해 이를 제공할 것이다.
클로져는 새로운 사고를 요구한다.

1.2 Understanding Clojure syntax

신택스는 호불호가 갈린다.
A Clojure expression is either < a symbol > or < a sequence >.
클로져는 배우기 지극히 간단한 언어다. (지랄. 아님) 신택스의 관점에서.. (맞아) 거의 아무것도 없다. (오케이)

1.2.1 XML and parentheses

1.2.2 Lists, vectors, and hashes

클로져는 리슾보다 더 많은 문법이 있지만, 이것이 가독성을 높여준다.
[ 벡터 ]  :  함수의 인수 리스트에 사용.  정수 인덱스 체계.
{ 해시 맵 / 사전 } : { :키 ,  값 }

1.3 The sources of Clojure’s power

1.3.1 Clojure and Lisp

1.3.2 Clojure and functional programming

> immutability, higher-order functions, laziness, concurrency semantics.

1.3.3 Clojure and the JVM

1.3.4 Clojure as a Lisp

AST (abstract syntax tree)
클로져의 런타임은 다른 언어와 다르게 작동한다. JIT 컴파일러 채용.. thanks to the JVM. 코드를 겁나 빠르게 컴파일 / 실행한다.
As alluded to, 암시…  contrive 억지스런, 고안해내다.
The Reader
리더는 소스코드를 AST 구현으로 크로져의 고유 데이터 구조를 이용하여 컨버트한다.
The Macro System
매크로는 클로져 함수. s-expression 을 인수로 받는다. s-expre.. 이 데이터 구조이므로 변형되고 반환가능하고 리턴된 값은 원래 형태로 사용된다.
이러한 코드-변형 매크로는 클로져 ‘위에’  미니 언어를 만들 수 있음.  DSLs (domain specific languages)
Metaprogramming with Macros
코드를 생산하는 코드
모든 클로져 코드는 같은 구조.  크로져 코드를 만들려면 심볼과 다른 데이터 구조를 갖는 클로져 데이터 구조를 만들면 됨.
이러한 신택스 없음과 매크로 시스템은 DSL 에 적합하게 한다.  ==> programmable programming language.
frivolous  천박한
매크로는 메타 프로그래밍의 ‘궁극’의 모습이다.

1.3.5 More advantages of Clojure

Dynamic Language
The REPL

1.3.6 Clojure as a functional language

클로져는 맵 리듀스 같은 higher-order functions 을 장려한다.
Higher-Order Functions

Machine Learning in Action Ch. 1, 2, 3

Part 1 CLASSIFICATION

1. Machine learning basics

Numpy, matrix, array etc

2. Classifying with k-Nearest Neighbors

숫자 인식.. 스킵.

3. Splitting datasets one feature at a time : decision trees

스무고개 ?  예/아니오 만 가능.
가장 보편적인 등급화 기법.  조사 결과 가장 많이 사용되는 ‘기법’.
이메일 분류.. 직원, 하키(친구) 기타는 스팸으로 분류.
콘택 렌즈 분류..

3.1 Tree construction

D. trees
Pro : 싸다, 결과를 사람이 인지하기 쉽다. 값이 빠져도 OK, 상관없는 특성들을 다룰 수 있다.
Cons : Prone to overfitting
숫자 값, niminal values 에 사용.

Information theory ..

데이터를 나눌 첫번째 결정을 설정해야..

createBranch .. 재귀적..
어떻게 데이터셋을 나눌 것인가.  [10/27]

General approach to decision trees
1. Collect : Any method.
2. Prepare :  ~~~

 

 

 

Functional Programming in C# [ Ch. 4, 5, 6 ] __ Oliver Sturm

Chap. 4. Flexible Typing with Generics [9/22]

제네릭 가능 : class, method, interface, delegate
대표적인 것 : 컨테이너 클래스.  다목적 베이스 클래스.

Generic Functions [9/22]

static void SomeThing<T> (T param) { // 함수 이름 뒤에 <타잎> 표시.
}
// Usage ..
SomeThing<int>(33);
SomeThing<string>(" The Parameter ");

<타잎> 변수 생략 가능 : 컴파일러 추론.

Generic Classes

..

Constraining Types 제한.

static void OutputVal<T> ( T value ) where T : ListItem<string> {}   // ListItem<string> 에서 파생되어야..

Other Generic Types

// Delegate
public delegate Rt SomeDelegate<T, Rt> (T param);  // Func<T, Rt> 와 같은 기능..
// Func
public delegate TResult Func<T1, T2, T3, T4, TResule> (T1 p1, T2 p2, T3 p3, T4 pr);
// 대부분의 추상 함수에 사용 가능.  4개 인수와 1개 리턴 값.
// Action 은 리턴 값이 없는 함수에 사용 가능.

Covariance and Contra variance

object[] objList = new object[3];
objList[2] = 10;
string[] strArr = new string[] { "one", "two", "thr" };
objList = strArr; // 이런 할당을 허용할 것인가..
// 좀 더 복잡한..
objList[2] = 10; // Runtime exception .. 어레이가 스트링 형이므로..
int[] intArr = new .... ;
objList = intArr; // intArr 는 밸류타입임.. 이 경우 covariance 는 레퍼런스 타잎만 지원

Variance 는 언어를 더 직관적으로 기능하게 하는 요소다.

List<object> objLst = new ...;
List<string> strLst = new ...;
objLst = strLst; // 허용 안됨.
// IEnumerable<T> 의 예.
public interface IEnumerable<out T> : IEnumerable { }  // retrieved from methods 에서 사용 가능. not passed into them.
IEnumeralbe<object> objSeq = new .. ;
IEnumeralbe<string> strSeq = new .. ;
objSeq = strSeq; // 가능.

4.0 에서 in, out 제레릭에서 사용 가능. 데이터 흐름의 방향을 제어 가능.

Chap. 5. Lazy Listing with Iterators

데이터를 효율적으로 다루기.

The Meaning of Laziness [9/23]

Linq 도 이같은 원리에 근거.

Enumerating Things with .NET

IEnumerable 인터페이스.
MoveNext(), Current(), Reset() …

Implementing Iterator Functions [9/24]

C# 2.0에서 도입된 IEnumerable / IEnumerator 조합을 이용. 제네릭, 넌제네릭 모두 가능.
특별한 형태의 리턴.  yield return 문.  Laziness ..  p49 코드를 볼 것.
리스트를 다 채우는 것이 아니라… 필요할 때 가져온다.. (미리 할 필요가 없다. 중간에 멈추면 후속 값 계산을 안 한다.).

Returning IEnumerator [9/29]

IEnumerable, IEnumerator ..

Chanining Iterators

.. laziness ..

.

Chap. 6. Encapsulating Data in Closures

Scope문제 Closure를 이용 해결.

Constructing Functions Dynamically [9/30]

C# 1.0 : ~ = C ..
delegate, event  : multicast
C# 2.0 : 무명함수.  함수를 만들어서 외부 스코프에 리턴하는 것은 이득이 많음.

The Problem with Scope

엄격한 스코프.
함수 플글에선 변하는 값을 별로 안 좋아함. 가이드 라인은 : { 변하는 값을 전혀 갖지 않음 }
가장 좁은 스코프 안에 집어 넣는 것.
순수 함수는 로컬 변수만 이용. 외부 참조 없음.   => 첫 반응은 incredulity.. 회의..
전역 변수가 않 좋은 이유 : 특정 시점에 어떤 값을 갖을 지 알 수 없음. ..
클래스 멤버는 좁은 스코프.
초기화 과정에서 나중에 쓰일 변수가 있다면 ?  클로져를 이용하는 대안..

How Closures Work

함수를 리턴하는 경우.. 그 안에 로컬 변수..  리턴 된 후 그 함수를 실행시키면 크래쉬. => 컴파일러가 그 값을 보관.
컴파일러는 무명 클래스를 생성하고 인스턴스 생성해서 그 함수를 부른 함수 내부에 둔다.
무명함수는 그 무명 클래스 내부의 함수로 생성. 그 콜러가 지속할 때까지 살아 있는다.  로컬 변수는 무명클래스의 필드로 된 것.
동적 함수는 객체 지향의 메서드 오버로딩과 유사. 하지만, 동적으로 생성됨.

Functional Programming in C# [ Ch. 1, 2, 3 ] __ Oliver Sturm

Chap. 1. A Look at Functional Programming History

What is Functional Programming ?

함수형 언어에서 Referential transparency 는 중요한 개념.  리턴 값이 입력 값에만 의존.
명령형 (imperative) 프로그래밍 과 대조.
함수형 언어 패러다임을 따르는 언어 : recursion 등 .. 을 쓰느냐..
-> 재귀 함수에서 스택에 위치해서 오버플로 하는 언어..  는 재귀를 쓰지 말아야.
고차 함수 : 함수를 인자로 받거나 리턴하는.
C에서는 무명 함수가 없다.
함수형 언어는 컴퓨터에서 문제를 푸는 방법을 알려주는 것. 일의 순서를 나열하는 것 보다는.. referential transparancy 는 이런 의미..

Functional Languages

Haskell, Erlang, Clojure.

The relationship to OOP

C#, F# .. albeit .

Chap. 2. Putting Functional Programming into a Modern Context

Concurrency Programming 에 의한 함수형 패턴 필요성.
Pararrel.foreach ..

Managing Side effects

Agile Programming Methodologies

함수 차원에서의 모듈화. 세분화된 작업을 할 때의 리팩토링. 클래스 차원에서는 너무 작업이 크다. ?

Declarative Programming

Funtional Programming is a Mindset

Is Functional Programming in C# A Good Idea?

Chap. 3. Functions, Delegates, & Lamda Expressions

Functions and Methods

C# 은 클래스 외에서의 함수는 인정 안함. => Methods 라 불림.

Reusing Functions

Anonymous Functions and Lambda Expressions

[sorting ] 비교 함수. 예.
[custom delegate ]

Func<object, object, bool> compareInt4 =
    (a, b) => ((int) a) > ((int) b);
Func<int, int, int> add = (x, y) => x + y;

람다 함수에서 var 사용 불가. 선언 시 타잎 추론 가능해야 함

Extension Methods [9/19]

Generic 도 가능.

Referential Transparency [9/21]

명령형 프로그램을 말할 때 대부분 ‘상태’ 에 관한 것이다.
명령형 프로그램의 주된 이슈중 하나는 코드가 점점 커진다는 점.
실행 순서에 촛점을 맞추므로 함수/메서드가 참조하기에 불투명해지는 경향이 있다. 같은 인수를 넣어도 동일한 결과가 나온다는 보장이 없다.
함수에서 사용하는 변수들이 여러 영역 (글로벌 .. )에서 가졍오기 때문.
RT 는 이와 반대. 이 단어는 어느 식에나 적용 가능하고, 프로그램을 바꾸지 않고 식이 값으로 바뀌어도 된다는 것.
수학에서 식은 항상 RT 하다. 즉, 3 + 2 는 5로 치환 가능하다.
어떤 함수는 RT 가 불가능. DateTime.Now, ReadByte 같은 것들. 특히 void 를 리턴하는 것들은 식으로 쓰일 수 없고, 참조적으로 불투명하다.
함수형 프로그램의 가장 중요한 컨셉중의 하나는 함수 구현에서 부작용을 피하는 것.
이것은 RT 와 매우 밀접한 관계이다. 순수한 함수는 인수로부터만 결과값을 만들어 부작용이 전혀 없는 것.
함수는 다른 함수를 부르거나 자신의 스코프 밖의 값을 사용할 수도 있다. PI 를 사용하는 예.

The general description of pure functions and side effects leaves out the perspective of the call site, from which a pure function can also be defined by saying that a call into a pure function is expected to be referentially transparent. 이 말이 정확하지는 않더라도  ..
순수한 함수를 쓰려면 인수만을 사용하고 끝에 리턴값을 리턴하라.  외부 변수에 접근하려면 그 일을 하는 다른 순수한 함수를 부르고.
실제 데이터요소에 접근하려면 그것이 상수 임을 확실히 하라. 이 조건에 맞지 않으면 부작용이다.
어떤 언어는 문법이 이를 불가능하게 함. 스크린에 뭘 출력하고 파일에 쓰는 것 들은 이 관점에서 모두 부작용임.

결과적으로 부작용을 피하는 것보다 더 중요한 것이 있다 : 부작용을 관리하는 것.  언어에 따라 이것이 쉽기도, 어렵기도.
순수한 함수를 쓰는 순수한 언어에서는 이를 회피하는 방법이 있다. 하스켈에서는 모나드가 이것을 가능하게 한다.
C#은 특별한 게 없다.  단지 아키텍쳐적인, 구조적인 문제일 뿐.

순수함수.. 마지막 말.
이렇게 코딩을 하면, 실행 순서, 함수가 불리는 순서는 중요하지 않다는 것.
개발자는 어떻게 함수들이 의존성의 네트웤을 형성하는 지 정의한다. 컴파일러가 최적의 실행을 한다.
이것은 최적화가 가능하게 하고, 중복된 코드는 자동제거될 수 있고, 캐시 적용가능하고, 로직파트는 병렬처리가 가능하다.
이런 가능성 리스트는 무한하고 많은 순수함수 환경은 이런 접근을 자동화한다.
충분한 이론-챕터가 나중에 이런 것들의 장점과 확장된 아이디어를 보여줄 것임.

닷넷 4.0 에서 code contracts 개념 도입.
PureAttribute.

C# in Depth. Jon Skeet. ch. 1

Dynamic languages suck away fluff from your code, leaving just the essence … Right..

The interesting thing is that few of the features that tend to give dynamic lan- guages their lightweight feel have anything to do with being dynamic.

Statically typed languages don’t have to be clumsy and heavyweight.

C# 1 : Java 와 비슷.  추가적인 것 :: properties as a first-class feature in the language, delegates and events, foreach loops, using statements, explicit method overriding, operator overloading, and custom value types, to name a few

1.1 Starting with a simple data type

목적 :: impress rather than educate

1.1.1 The Product type in C# 1

using System.Collections;
public class Product
{

   string name;
   public string Name { get { return name; } } // getter 가 필요하면 정의해야 함 .. fluff ..

   decimal price;
   public decimal Price { get { return price; } }

   public Product(string name, decimal price)
   {
      this.name = name;
      this.price = price;
   }

   public static ArrayList GetSampleProducts()
   {
      ArrayList list = new ArrayList(); // 뭐가 들어가는 지 모른다.
      list.Add(new Product("West Side Story", 9.99m));
      list.Add(new Product("Assassins", 14.99m));
      list.Add(new Product("Frogs", 13.99m));
      list.Add(new Product("Sweeney Todd", 10.99m));
      return list;</pre>
}
public override string ToString()
 {
 return string.Format("{0}: {1}", name, price);
 }
}

1.1.2 Strongly typed collections in C# 2  __ generic ..

public class Product
{
   string name;
   public string Name
   {
      get { return name; }
      private set { name = value; } // ***
}
decimal price;
public decimal Price
{
      get { return price; }
      private set { price = value; }</pre>
}
public Product(string name, decimal price)
{
 Name = name;
 Price = price;
}

public static List GetSampleProducts() {
 List list = new List();
 // type 명시.. 리스트에서 가져올 때 캐스팅 필요 없음.
 list.Add(new Product("West Side Story", 9.99m));
 list.Add(new Product("Assassins", 14.99m));
 list.Add(new Product("Frogs", 13.99m));
 list.Add(new Product("Sweeney Todd", 10.99m));
 return list;
}
public override string ToString()
{
 return string.Format("{0}: {1}", name, price);
}
}

1.1.3 Automatically implemented properties in C# 3

using System.Collections.Generic;
class Product
{
  public string Name { get; private set; } // 코드, 변수도 없다. Name 은 함수명.
  public decimal Price { get; private set; }
  public Product(string name, decimal price)
  {
    Name = name;
    Price = price;
  }
  Product() {}
  public static List GetSampleProducts()
  {
    return new List
    {
      new Product { Name="West Side Story", Price = 9.99m },
      new Product { Name="Assassins", Price=14.99m },
      new Product { Name="Frogs", Price=13.99m },
      new Product { Name="Sweeney Todd", Price=10.99m}</pre>
 };
 }
 public override string ToString()
 {
 return string.Format("{0}: {1}", Name, Price); }
 }
}

1.1.4 Named arguments in C# 4

readonly decimal price;
public decimal Price { get { return price; } }
public Product(string name, decimal price)
{
  this.name = name;
  this.price = price;
}
new Product(name: "West Side Story", price: 9.99m);  // 이렇게 인수 이름을 붙여 초기화.

1.2 Sorting and filtering

1.2.1 Sorting products by name

ArrayList products = Product.GetSampleProducts(); // C# 1</pre>
List products = Product.GetSampleProducts(); // C# 2
List products = Product.GetSampleProducts(); // C# 3
products.Sort(delegate(Product x, Product y)
 { return x.Name.CompareTo(y.Name); }
);

1.2.2 Querying collections

List products = Product.GetSampleProducts();
Predicate test = delegate(Product p) { return p.Price > 10m; };
Listmatches = products.FindAll(test);
Action print = Console.WriteLine;  // method group conversion (C# 2)
matches.ForEach(print);
// Differently ...
List products = Product.GetSampleProducts();
products.FindAll(delegate(Product p) { return p.Price > 10;}) .ForEach(Console.WriteLine);  // 노이지 하다. { } 딜리깃.
// C# 3
List products = Product.GetSampleProducts();
foreach (Product product in products.Where(p => p.price > 10)) {
  Console.WriteLine(product);
}

1.3 Handling an absence of data

1.3.1 Representing an unknown price

Nullable
decimal? price;
public decimal? Price
{
  get { return price; }
  private set { prie = value; }
}
..
Price == null // 조건식..

1.3.2 Optional parameters and default values

public Product(string name, decimal? price = null)
{
  this.name = name;
  this.price = price;
}

1.4 Introducing LINQ

C# 3..

1.4.1 Query expressions and in-process queries

List products = Product.GetSampleProducts();
List suppliers = Supplier.GetSampleSuppliers();
var filtered = from p in products
               join s in suppliers
                   on p.SupplierID equals s.SupplierID
               where p.Price > 10
               orderby s.Name, p.Name
               select new { SupplierName = s.Name, ProductName = p.Name };
foreach (var v in filtered)
{
    Console.WriteLine("Supplier={0}; Product={1}",
                 v.SupplierName, v.ProductName);
}

1.4.2 Querying XML

1.4.3 LINQ to SQL

..

1.5 COM and dynamic typing

c# 4 : Com, DLR (Dynamic Language Runtime)

1.5.1 Simplifying COM interoperability

1.5.2 Interoperating with a dynamic language

ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.ExecuteFile("FindProducts.py");
dynamic products = scope.GetVariable("products");
foreach (dynamic product in products)
{
  Console.WriteLine("{0}: {1}", product.ProductName, product.Price);
  // 여기서 에러가 날지도 모르지만.. 어떻게든 진행함.
}

1.6 Dissecting the .NET platform

1.6.1 C#, the language

IL -> JIT compiler.

1.6.2 Runtime

런타임 부분은 IL 의 작은 부분..  CLI : Common Language Infrastructure, CLI 의 런타임은 CLR ( ~~ ~~ 런타임) 으로 불림..  이 책에서는 마소 의 구현을 가리킴.
언어의 일부는 런타임 레벨에 보이지 않지만, 다른 것들은 구분을 넘는다.  … 어레이와 딜리깃은 런타임에 중요.

1.6.3 Framework libraries

 

__

Biggest Change in C++ 11

일단 원문 출처  이곳을 안내한 곳..  GameCodi.com

C++  의 창안자 Bjarne Stroustrup은 11 이 새로운 언어 느낌이라고 함. 코어 시++ 은 많이 변화했다.

람다 표현식, 자동 타잎, uniform initialization syntax, delegate 구조, nullptr, 가장 중요한 rvalue reference… 객체를 이해하는 패러다임의 주요 변화.

1998년에 시++ 이 정의될 때 다음 버전에는 가비지 컬렉션이 들어갈 거라고 했지만, 들어가지 않았고, 대신 “최신의 쓰레딩 라이브러리” 가 들어갔다.

Lambda Expression

[capture](parameters)->return-type {body}

한 함수 내에서 다른 함수를  정의하는 듯.

Automatic type  deduction and decltype

오토.. auto..

auto   mVar = 12340000000LL   // Long Long..

템플릿에서 자동 생성될 때 유용.

Uniform Initialization Syntax

4가지 초기화 방법

()

=

[]  {}

member initializer

이것을 정리

MyClass classObj  { 0, 23 } ;  // C++ 11 only  이렇게.

멤버 어레이 초기화 등등.

in class initialization

Deleted and Defaulted Functions

함수에 = default   or   = delete  할당.  객체 복사 방지.

nullptr

strongly typed. 숫자 0 = 널 포인터 였는데.. 이걸 구분하게 됨.

Delegating Constructors

생성자 내부에서 다른 생성자 부를 수 있음..

Rvalue References

lvalue 밖에 참조를 못 했다. r value 는 임시 객체, 숫자에 쓰임.

쓰이게 된 이유는  move semantics.   복사와 달리 ‘옮김’ 은 기존 객체의 것을 빼오는 것. 복사가 비싸고 불필요할 때 무브를 쓸 수 있다. 스트링 스와핑 같은..

C++ 11 Standard Library

Threading Library

Concurrency..

New Smarter Pointer Classes

C++ 98 auto_ptr 이 있었다. 폐기됨. C++ 11 .. shared_ptr & unique_ptr

New algorithms

all_of(), any_of (), none_of () …