잊지 않겠습니다.

'Dynamic Language'에 해당되는 글 25건

  1. 2009.01.07 Chapter 06. Method
  2. 2009.01.07 Chapter 05. Standard data type
  3. 2009.01.07 Chapter 04. Container, Block, Iteritor
  4. 2009.01.07 Chapter 03. Class, Instance, Variable
  5. 2009.01.07 XML 처리
Ruby에서의 Method의 기본 규칙
  1. def keyword이용
  2. 반드시 소문자로 시작
  3. 무언가를 묻는 method는 대부분 ´?´로 종결
  4. 객체의 값을 바꾸거나 위험한 method는 모두 !로 종결
  5. 대입문에 사용 가능한 method는 =로 종결된다. 
  6. return 값은 마지막으로 실행된 표현식의 결과값이거나 명시적으로 쓰인 return값의 결과가 얻어진다. 
가변 인자 리스트

: python과 비슷하게 가변 인자가 들어가는 경우에는 *로 가변 형식 인수를 구분할 수 있다.

def varargs(arg1, *rest)

"Got #{arg1} and #{rest.join(' ,')}"

end 

Method와 Block

Method내부에서는  yield를 이용해서 block의 코드를 호출 할 수 있다.
Method 선언부에서 형식인수에 &가 붙은 경우에는 형식 인수에  block이  Proc  함수로 대응되어 들어가게 된다.

 class TaxCalculator
    def initialize(name, &block)
        @name, @block = name, block
    end
    def get_tax(amount)
        "#{amount}원에 대한 #{@name} = #{ @block.call(amount) }"
    end
end
 
Method의 호출
print "(t)imes or (p)lus : "
times = gets
print "number"
number = Integer(gets)

if times =~ /^t/
    calc = lamda { |n| * number }
else
    calc = lamda { |n| + number }
end
puts( (1..10).collect(&calc).join(", ") )


Python에서와 동일하게 Hash Table을 이용한 함수의 선언도 역시 사용가능하다.

list.create_search("short jazz songs", 
                 {
                   'genre' => "jazz",
                   'duration_less_than' => 270
                 }
Posted by Y2K
,

Number

Ruby에서는 모든 숫자도  Class로 구성이 된다. 따라서  숫자 뒤에 '.'을 입력하게 되면 method를 호출하는 것이 가능하다.

irb(main):017:0> num.times { print "this number is printed\n" }

Standard Regular expression

문자열 표현에 대한 식을 저장할 수 있으며 문자열을 치환역시 가능하다.

패턴에서 .,|,(,),[,],+,\,/,^,$,*,? 를 제외한 모든 문자은 자신에 매치가 된다. 이 문자를 지정하기 위해서는 \를 이용해서 문자를 적어주면 된다.

  • ^ : 각 줄에서 가장 처음을 나타낸다.
  • $ : 각 줄에서 가장 나중을 나타낸다.
  • \A : 지정된 문자열의 첫부분을 나타낸다
  • \Z : 지정된 문자열의 맨 마지막부분을 나타낸다.
  • \B : 문자열이 아닌 것의 경계를 나타낸다.
  • \b : 문자열의 경계를 나타낸다.
  • \s : 공백을 나타낸다.
  • \w : 문자열을 나타낸다.
  • [] : 문자열의 집합을 나타낸다. 안에서 c1-c2와 같은 sequence를 사용하는 경우에는 c1에서부터 c2까지의 모든 문자를 나타낸다. ^를 사용하는 경우에는 역으로 지정이 된다. 
반복
  • r* : r이 없거나 1개 이상 나타나는 문자열에 매치
  • r+ : r이 하나 이상 나타나는 문자열과 매치
  • r? : r이 한번 또는 나타나지 않는 문자열과 매치
  • r{m,n} : m이상 n이하 나타나는 문자열과 매치
  • r{m, } : m이상 나타나는 문자열과 매치
그룹 : ()를 이용해서 그룹으로 묶어주는 것이 가능하다.
show_regexp("this is \nthe time", /^the/) -> this is\n<<the>> time
show_regexp("this is \nthe time", /is$/) -> this <<is>>\n the time
show_regexp("this is \nthe time", /\Athis/) -> <<this>> is \n the time
show_regexp("this is \nthe time", /\Athe/) -> no match
show_regexp("Price $12.", /[aeiou]/) -> Pr<<i>>ce $12
show_regexp("Price $12.", /[\s]/) -> Price<< >>$12
show_regexp("Price $12.",/:digit:/) -> Price $<<1>>2
show_regexp("see [Degine pattterns-page 123]", /[^a-z]/) -> see<< >> [Degine pattterns-page 123] 
: 패턴은 언제나 맨처음에 나오는 것에 인식이 된다. 여기에서는 소문자 a에서부터 z까지를 제외한 모든 문자를 
검색하기 때문에 /s가 먼저 검색된 상태이다.

Ruby에서는 검색된 문자열을 $1, $2와 같은 특별한 변수에 저장하고 결과를 사용하는 것 역시 가능하다.

 

문자열의 치환

  • string#sub method : 문자열 부분을 한번만 변경 시킨다.
  • string#gsub method : 문자열 부분을 모두다 변경시킨다. 
ex:모든 단어의 첫글자를 대문자로 변경시켜주는 Method
패턴은 \b\w
def mixed_case(name)
    name.gsub(/\b\w/) { |first| first.upcase }
end

 

Posted by Y2K
,

Container

Array의 형태는 '[]'로 만들어준다.

a = [3.14, "pie", 99]

음수의 index의 경우에는 뒤에서부터 세는것이 가능하다.

shift,  pop이 모두 가능하다. 

Hash의 경우에는 '{}'로 만들어준다.

h = {'cat'=>'cats name', 'dog'=>'dogs name', 'count'=>10}

Block과 Iteritor

yield의 구현 : code block을 실행시켜주는 method.

sorce code에서는 block은 method 호출 바로 뒤에서만 나타나게 된다.

block안의 code는 나타나자마자 실행되지 않는다. 대신 Ruby가 block이 나타날 때의 상태를 기억하고 method로 들어가게 된다.

yield가 실행될 때마다, Block의 코드가 실행된다. : yield의 경우에는 Block의 code를 호출하고, 그 변수를 return 시켜주게 된다. 

def fix_up_to(max)
    i1, i2 = 1, 1
    while i1 <= max
       yield i1
       i1, i2 = i2, i1 + i2
    end
end

fix_up_to(1000) { |f| print f, " " }

: 실행순서 i1이 리턴된 후에 f로 들어가게 되어서, print f가 실행된 후에 다시 while 문으로 된다.

Block code의 경우에는 그 안에 있는 변수는 내부에서만 효용있는 변수가 된다.

 

 

Posted by Y2K
,
Class
  • 생성자 : initialize() 함수가 생성자로 만들어진다.
  • 모든  Class들은 열려져있는 상태를 유지하게 된다. 이미 정의된 CLass에서라도 언제든 원하는 메서드를 추가하는 것이 가능하다.
    • 같은 method를 다시 선언해서 치환하는 것이 가능하다.
  • super
    • 부모 Class에서의 선언되어있는 모든 것들을 의미한다.
    • Kasaoke < Song 의 경우에,  to_s의 부모 선언부를 알아보기 위해서는 다음과 같이 사용하면 된다.
    • 각 객체의 super class 를 순차적으로 찾아가면서 찾게 된다.
 class KaraokeSong < Song
    def to_s
        super + " [#@lyrics]"
    end
 end

Instance와 Property

C#에서의  property와  같은 접근법을 제공한다.(C# 3.0에서는 오히려 Ruby와 동일한 Class의 생성법들을 제공하고 있다.)

class Song
    attr_reader :name, :artisit, :duration
    attr_writer :name, :artist, :duration
end

위와 같은 코드에서는 자동적으로 @name, @artist, @duration과  Song.name, Song.artist, Song.duration의  읽고 쓰기가 가능한 Property가 생성이 된다.

Method와 속성과의 차이

: C#에서도 같은 이야기가 나온적이 있었고, 무언지 좋은지 나쁜지에 대한 토론이 자주 있었던것 같다. 그렇지만, 이에 대해서 확실한 것은 code의 가독성이라는 것에 대한 차이는 상당히 크다고 생각이 된다. 여러가지 코드를 볼때 언제나 값을 넣을 때, set, get의 Method만을 호출하는 것과, 자신의 Class의 값에 대해서는 Property를 이용해서 값을 넣고, 무언가 다른 class나 다른 resource에 값을 설정하고 저장할 때, 그에 대한 내용으로 set, get을 이용하는 것이 좀더 나은 방법으로 생각된다.

Class Variable & Class Method

:  생성된 모든 Class에서는 모두 instance를 가지게 된다.  Ruby에서 제공되는 Class Variable과 Class Method는 일반적으로 제공되는 Static Method와 Static Variable과 동일하게 생각하면 된다.


Class Variable

: '@@'로 정의된 변수를 의미한다. 모든 Class에서 공용으로 사용하게 된다.

Class Method

: 선언부로 instance메서드와 구분된다.

class Example
    def instance_method
    end
    def Example.class_method
    end
end
Singleton과 다른 생성자들

다음과 같은 코드를 이용해서 생성자로 생성을 못하고, 자신의 다른 생성자를 이용해서 instance를 생성시키는 것이 가능하다.

class MyLogger
    private_class_method :new
    @@logger = nil
    def MyLogger.create
        @@logger = new unless @@logger
        @@logger
    end
end
Class의 접근 제어 방법

Ruby에서는 모든 함수의 접근 제어 방법이 기본적으로 "public"으로 선언된다.

함수의 앞부분에 public, protected, private로 지정이 가능하다.

Class의 모든 단계에서 선언도 가능하다.

class MyClass
    public : method1, method4
    protected : method2
    private : method3

Posted by Y2K
,

XML 처리

Dynamic Language 2009. 1. 7. 13:11

XML의 처리 방법

  1. SAX (simple api for xml)
    1. Event 기반의 XML 처리 기법
  2. DOM (document object model)
    1. Object 기반의 XML 처리 기법
  3. XPath
  4. XSLT

  

XML 해석

  1. Parser가 XML 문서를 해석한 후, 응용프로그램에서 해석 결과를 가지고 이용한다.
  2. SAX에서는 XML 문서 구조에 대한 트리를 메모리에 생성하지 않고, 이벤트가 발생할 때마다 지정된 이름의 Callback이 이루어지게 된다.
    1. 문서를 순차적으로 읽으면서 발생
    2. 한가지 진행 방향으로만 참조가 가능
    3. 메모리의 사용량이 작다.
    4. 빠른 처리가 가능
    5. 노드의 추가나 노드의 이동 등 구조적인 변화를 주는 것은 불가능하다.
  3. DOM에서는 메모리 상에 문서 구조와 일치하는 객체 트리를 생성하고, 응용 프로그램은 API를 통해, 직접 참조하게 된다.
    1. 메모리의 부담이 증가
    2. SAX보다 처리시간이 많이 든다
    3. 전체 문서를 볼 수 있는 관점을 제공
    4. 임의의 노드 이동 및 수정, 추가가 자유롭다

  

XML 해석 - SAX

  1. 각각의 attribute에 대한 Handler를 작성해준다.
  2. Parser에서 handler를 등록해서, parsing을 시켜준다.
from xml.sax import make_parser, handler
import sys

class ProductHandler(handler.ContentHandler):
    def __init__(self, productName):
        self.productName = productName
        self.productList = []
        self.charActive = 0
        self.searchActive = 0
    def startElement(self, name, attrs):
        if name == 'product':
            if self.productName.lower() == attrs.get('name', '').lower():
                self.searchActive = 1
            else:
                self.searchActive = 0
        if not self.searchActive:
            return
        if name == 'vendor':
            self.vendor = attrs.get('name', 'unknown')
        elif name == 'price':
            self.model = attrs.get('model', 'unknown')
            self.priceStr = ''
            self.charActive = 1
    def endElement(self, name):
        if self.searchActive and name == 'price':
            self.productList.append( (self.vendor, self.model, int(self.priceStr) ) )
            self.charActive = 0
    def characters(self, content):
        if self.charActive:
            self.priceStr += content
    def endDocument(self):
        self.productList.sort(lambda a,b : cmp(a[2], b[2]))
        for product in self.productList:
            print '%-7s %6s %5s' % product

if __name__ == '__main__':
    h = ProductHandler(sys.argv[1])
    parser = make_parser()
    parser.setContentHandler(h)
    parser.parse('c:\python25\scripts\product.xml')

  

XML 해석 - DOM

  • DOM 구조는 모듈로 나누어진다. 각 모듈은 Domain을 나타낸다.
    • Core : 문서를 조작하고, 접근하여 사용하는 인터페이스 정의
    • XML : Core를 기반으로 처리 명령, CDATA, 엔티티와 같은 XML 1.0 정규 규정을 처리 할 수 있도록 설계
    • HTML : HTML 문서를 조작할 수 있는 인터페이스를 제공
    • Events: XML 트리 조작에 따른 이벤트와 마우스, 키보드나 HTML 관련 이벤트와 같은 사용자 이벤트를 정의한다.
    • Load/Save : XML 문서를 DOM Tree구조로 얻어오고, DOM 트리를 XML 문서로 저장하기 위한 연산 제공
    • Validation : DOM 트리에 대한 메소드 정의
    • XPath : DOM 트리를 검색하기 위한 편리하고 간편한 표현식을 사용 가능하게 한다.
    • Range : 문서의 영역을 저장하기 위한 기능
    • Traversal : DOM 트리를 검색하기 위한 메소드 제공
    • Views : 하나의 문서를 여러 형태로 볼 수 있게 하는 기능 제공
    • Style Sheets : 스타일 시트를 표현하기 위한 추상 인터페이스 제공
    • CSS : CSS 스타일 시트나 문서 서식을 다룰 편리하고 간편한 기능 제공

  

Posted by Y2K
,