C# 4.0에 대한 윤곽이 나왔었습니다.
 요즘은 C++에 집중하느라고 다른 Language들을 잘 보지 않고 있었는데.. 알고보니 지금 포스팅 하기엔 민망한 소식이기도 합니다.

 C# 4.0에 대한 소개를 보니.. 정말 매력적인 Feature들이 추가되었습니다.
 C# 3.0 때 추가된 Type inference, Lambda expressions, LINQ 등도 꽤나 신선했었는데..
 C# 4.0에 추가된 dynamic keyword나 COM 객체에 사용성 향상 같은 대한 지원은 당장이라도 테스트 어플리케이션을 만들고 싶고, 기존 코드를 고치고 싶게 합니다.


 저기 동영상 중에서 Anders Hejlsberg 아저씨의 PDC 2008에서의 발표는 정말 볼만합니다.
 C# 언어 설계자가 새로 설계한 부분에 대해서 직접 발표를 하다보니 아무래도 흥미롭습니다..


 동영상의 일부분을 보면...


 C# 언어의 발전 과정입니다.
 이제 만든지 10년이 넘었다져..




 C# 4.0의 Language 자체에서 지원되는 변화입니다.
 해당 키워드들에 C#을 붙여서 구글링을 하면 자세한 정보를 얻을 수 있습니다.
 - Dynamically Typed Objects
 - Optional and Named Parameters
 - Improved COM Interoperability
 - Co- and Contra-variance





 C# 4.0 이후에 Compiler를 약간 오픈해서 Meta-Programming에 대한 지원도 강화할 것이라고 합니다.



 데모로 만든 C# Interactive Shell을 보여주는데..
 Winform으로 Windows 하나를 띄우고,
 거기에 Background Image를 입히고,
 Button UI을 추가하고,
 Button을 누르면 Console에 "Hello world" 를 출력하는 이벤트 핸들러를 추가 합니다.

 좀 찾아보니 Mono 2.2에선 이 기능이 추가된 것 같네요.



Posted by U∙Seung

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지














Microsoft에서 무료로 e-Book를 PDF버전으로 제공하네요.
아쉽게도 책의 전체가 있는 것은 아니고 일부 내용만 있는 것도 있지만 참고할만한 것 같아서 공유합니다. Bold 표시된 Chapter만 있습니다.


Introducing Microsoft Silverlight 1.0

by Laurence Moroney

Chapter 1: Silverlight and the User Experience
Chapter 2: Silverlight and XAML
Chapter 3: XAML: Transformation and Animation
Chapter 4: Silverlight and Media
Chapter 5: Programming Silverlight with JavaScript
Chapter 6: Using Silverlight with Ink
Chapter 7: Silverlight and Server Programming
Chapter 8: Silverlight Futures


Introducing Microsoft LINQ
by Paolo Pialorsi and Marco Russo

Chapter 1. LINQ Introduction
Chapter 2. C# Language Features
Chapter 3. Visual Basic 9.0 Language Features
Chapter 4. LINQ Syntax Fundamentals
Chapter 5. LINQ to ADO.NET
Chapter 6. LINQ to XML



Introducing Microsoft ASP.NET AJAX
by Dino Esposito

Part I: ASP.NET AJAX Building Blocks
- Chapter 1. The AJAX Revolution
- Chapter 2. The Microsoft Client Library for AJAX
Part II: Adding AJAX Capabilities to a Site
- Chapter 3. The Pulsing Heart of ASP.NET AJAX
- Chapter 4. Partial Page Rendering
- Chapter 5. The AJAX Control Toolkit
Part III: Client-Centric Development
- Chapter 6. Built-in Application Services
- Chapter 7. Remote Method Calls with ASP.NET AJAX
- Chapter 8. Building AJAX Applications with ASP.NET
 




------------------------------

사용자 삽입 이미지


이 책은 Inside C# 2nd의 한글 번역본인데 Full Text와 예제파일을 제공하네요.
무료 치고는 좋은 자료 같습니다. 물론 C# 3.0이 나오기 전이라서 LINQ등의 새로운 부분은 없어서 아쉽긴 하네요.

Part 1 C# 클래스 기초
- Chapter 1 C# 응용 프로그램 및 라이브러리 빌드하기
- Chapter 2 .NET 타입 시스템
- Chapter 3 클래스와 구조체
- Chapter 4 메서드
- Chapter 5 프로퍼티, 배열, 인덱서
- Chapter 6 어트리뷰트
- Chapter 7 인터페이스

Part 2 코드 작성하기
- Chapter 8 수식과 연산자
- Chapter 9 프로그램 흐름 제어
- Chapter 10 String 다루기 및 정규식
- Chapter 11 스트림을 이용한 파일 I/O
- Chapter 12 예외를 이용한 오류 처리
- Chapter 13 연산자 오버로딩과 사용자 정의 변환
- Chapter 14 위임과 이벤트 처리기
- Chapter 15 XML을 이용한 문서화

Part 3 C# 고급 기능 사용하기
- Chapter 16 수치 연산과 Math 클래스
- Chapter 17 컬렉션과 객체 열거
- Chapter 18 멀티쓰레딩과 비동기 프로그래밍
- Chapter 19 리플렉션을 사용하여 메타데이터 정보 조회하기
- Chapter 20 메모리 고정과 관리
- Chapter 21 C# 응용 프로그램에서 COM 사용하기
- Chapter 22 비관리 코드에서 .NET 컴포넌트 사용하기
- Chapter 23 보안
 


Posted by U∙Seung

얼마전에 C# 3.0으로 만든 QuickSort를 포스팅한 이후로도 C#에 대한 생각을 평소 많이 하고 있다.
다만 C#을 Main 언어로 코딩한다면 좋겠지만 아직은 C++을 많이 쓰는 상황이라서 아쉬움이 많다.

C#의 새로운 Functional Feature들을 보면서 떠오르는 것은 단연 SICP였다.

사용자 삽입 이미지

 이 책은 MIT에서 강의용 교재로 쓰이는 책인데, 얼마전 우리나라에도 번역본이 나와서 인기를 끌고 있으며(컴퓨터 프로그램의 구조와 해석), 최근 있었던 Microsoft DevDays 2007에서도 김명호 박사님의 KeyNote에서 소개 되어서 더욱 유명세를 타기도 한 바로 그 책이다.

 암튼 책에 나오는 몇가지 Sample들을 C#으로 다시 만들어 보았다.
 Scheme은 Type이 없고, 괄호를 중심으로 하는 표현방식이라  조금만 코드가 길어지면 머리가 복잡해지는데 반해, C#은 Type이 분명하고, Syntax도 익숙하여 훨씬 Writablity가 높았다. Type의 축복이랄까;;


 몇가지 예제들을 공유하여 본다. 비교하면서 보는 것도 재미가 있을 것 같다.
 예전에 Javascript로도 만든 것도 참조 하면 괜찮을지 모르겠다.


#1. 간단한 함수 - 홀짝 판단

LISP
(define (odd? n)
 (if (= n 0)
   #f
   (even? (- n 1))))

(define (even? n)
 (if (= n 0)
   #t
   (odd? (- n 1))))


C#
static bool IsEven(this int num)

{

    return (num == 0) ? true : IsOdd(num - 1);

}


static bool IsOdd(this int num)

{

    return (num == 0) ? false : IsEven(num - 1);

}




#2. Prime 판단하기


LISP
(define (smallest-divisor n)
 (find-divisor n 2))
(define (find-divisor n test-divisor)
 (cond ((> (square test-divisor) n) n)
       ((divides? test-divisor n) test-divisor)
       (else (find-divisor n (+ test-divisor 1)))))
(define (divides? a b)
 (= (remainder b a) 0))

(define (prime? n)
 (= n (smallest-divisor n)))


C#
public static bool IsPrime(this int num)

{

    Func<int, int> FindSmallestDivisor = divisor =>

    {

        if (divisor * divisor > num) return num;

        if (num % divisor == 0) return divisor;

        return FindSmallestDivisor(divisor+1);

    };

    return (FindSmallestDivisor(2) == num);

}




#3. 무한대 수열 다루기 - 자연수 만들기

LISP

(define (cons-stream a b) (cons a (delay b)))

(define (stream-car stream) (car stream))

(define (stream-cdr stream) (force (cdr stream)))

(define (integers-starting-from n)
  (cons-stream n (integers-starting-from (+ n 1))))

(define integers (integers-starting-from 1)


C#

static IEnumerable<T> ConsStream<T>(this T t, IEnumerable<T> ts)

{

    yield return t;

    foreach (var nextT in ts)

        yield return nextT;

}


static

IEnumerable<int> IntegerStrartingFrom(int num)

{

    foreach (var item in 
        num.ConsStream(IntegerStrartingFrom(num + 1)))

        yield return item;

}


static IEnumerable<int> Numbers()

{

    return IntegerStrartingFrom(1);

}


static IEnumerable<int> Primes()

{

    return Numbers().Where(n => n.IsPrime());

}



#4. 무한대 수열 다루기(2) - 피보나치 수열 만들기

LISP
(define fibs
  (cons-stream 1
               (cons-stream 1
                            (add-streams (stream-cdr fibs) fibs)))))

(define (add-streams s1 s2)
  (stream-map + s1 s2))

(define (stream-map proc . argstreams)
  (if (null? (car argstreams))
    the-empty-stream
    (cons-stream
      (apply proc (map stream-car argstreams))
      (apply stream-map (cons proc (map stream-cdr argstreams))))))


C#

static IEnumerable<int> Fibs()

{

    foreach (var item in

        ConsStream(1,
        ConsStream(1, Fibs().Plus(Fibs().Tails()))))

        yield return item;

}

 

public static IEnumerable<int> Plus(this IEnumerable<int> ts1, IEnumerable<int> ts2)

{

    return ts1.Map(ts2, (t1, t2) => t1 + t2);

}

 

public static IEnumerable<T> Map<T>(this IEnumerable<T> ts1, IEnumerable<T> ts2, Func<T, T, T> Proc)

{

    foreach (var item in 
        Proc(ts1.Head(), ts2.Head())
        .ConsStream(Map(ts1.Tails(), ts2.Tails(), Proc)))

        yield return item;

}






#5. 공유 변수 - Counter 만들기


LISP

(define counter (make-cnt 0))

(define (make-cnt count)
 (lambda ()
   (set! count (+ count 1))
   count))


C#

public static Func<int> MakeCounter(int initialNumber)
{
    return () => (++initialNumber);
}

static void Main(string[] args)
{
    Func<int> Counter = MakeCounter(10);
    Counter();
    Counter();
    Debug.WriteLine(Counter());

}

위의 결과는 13


Posted by U∙Seung

static void Main(string[] args)

{

    var list = new[] { 1, 9, 5, 3, 7, 2 };

    list.WriteLine();

    list.QuickSort().WriteLine();

}


오랜만에 코딩이 들어간 포스팅 이네요
.
잘 모르고 있었는데 C# Functional Feature가 많이 들어 갔더군요
.
그래서 간단히 공부겸 테스트겸 가볍게 코드를 만들어 보고, 이를 공유 합니다
.

만들어본 코드는 Quicksort이며, Main함수의 내용은 위와 같고
,
실행한 결과는 아래와 같습니다.

{ 1, 9, 5, 3, 7, 2 }
{ 1, 2, 3, 5, 7, 9 }


먼저 첫 줄, 별 생각 없이 봐도 integer의 리스트를 만들었다는 것을 알 수 있습니다.

var list = new[] { 1, 9, 5, 3, 7, 2 };

 

다만, 자세히 보면 type이 전혀 선언되지 않았다는 것을 알 수 있습니다.
C# 3.0
에서는 Implicitly typed local variables을 지원해서

javascript
스러운 var a = 3 같은 문법을 지원합니다
.
자세한 것은 문서를 참조 하시고,,,

 

list.WriteLine();

list.QuickSort().WriteLine();

 

두 번째부터 세 번째 줄을 살펴보면 list Object MethodWriteLine() QuickSort()를 호출한 것을 볼 수 있습니다. 여기서 눈 여겨 볼 것은 QuickSort()Writeline()은 원래 있는 Method가 아니라 사용자가 만든 확장 Method라는 겁니다. 여기서 list variable Type Explicit하게 정의 하지 않았지만 C#에서 Type inference를 통해 Type이 결정되는데 여기에서는 int[]로 결정이 되겠지요. , C#에서도 다른 Dynamic Language같이 기존에 존재하는 Type에도 확장 함수(Extension Methods)를 추가할 수 있다는 것 입니다.

 

 

실제 Sort부분의 코드를 보면

 

public static IEnumerable<int> QuickSort(this IEnumerable<int> Ts)

{

    return Ts.Case(

        () => Ts,

        (head, tail) =>

            QuickSort(tail.Where(t => t < head))

            .Concat(new[] { head })

            .Concat(QuickSort(tail.Where(t => t >= head)))

            );

}

 

 

여기서 headtype int, tailtype int[]라는 것을 잘 봐야 합니다. C# 2.0에도 anonymous method가 있었는데 C# 3.0에서는 lambda expressions로 더욱 강화 되었습니다. Type inference feature가 추가 되면서 일일이 Parameters type을 적을 필요가 없게 된 것이 매우 큰 변화라 할 수 있을 것 같습니다. Javascript 등과 비교했을 때도, function(x) { return x; } 라고 지저분하게 적었어야 했는데, 이를 (x) => x 라고 적으면 된다니 코드를 작성하는 입장에서는 매우 반가운 일 입니다.

 

 

아무튼 나머지 코드는.


public static void WriteLine<T>(this IEnumerable<T> Ts)

{

    Debug.Write("{ " + Ts.Head());

    foreach (T t in Ts.Tail())

        Debug.Write(", " + Convert.ToString(t));

    Debug.WriteLine(" }");

}


public static T Head<T>(this IEnumerable<T> Ts)

{

    foreach (T t in Ts)

        return t;

    throw new ArgumentException();

}

 

public static IEnumerable<T> Tail<T>(this IEnumerable<T> Ts)

{

    bool head = true;

    foreach (T t in Ts)

    {

        if (head) head = false;

        else yield return t;

    }

}

 

public static IEnumerable<T> Case<T>(this IEnumerable<T> Ts, Func<IEnumerable<T>> CaseEmpty, Func<T, IEnumerable<T>, IEnumerable<T>> CaseNotEmpty)

{

    if (Ts.Count() > 0)

        return CaseNotEmpty(Ts.Head(), Ts.Tail());

    return CaseEmpty();

}

 

 

참조한 곳은..

C# is a functional programming language

Overview of C# 3.0, C# Version 3.0 Specification

 

------------

 Methods를 좀 뒤져 봤는데.
 Head() 는 First()로
 Tail()은 Skip(1)로 대체할 수 있을 것 같네요.

 

Posted by U∙Seung