PL λαβ

Lab 1.1[김예령]: Data 만들기 본문

kos

Lab 1.1[김예령]: Data 만들기

IC4RUS 2021. 4. 6. 20:44

LAB 1.1 목표

  • python으로 Integer, Symbol, NIL, Pair Type을 구현한다.
  • pair object를 생성하는 cons와 pair의 value를 받아오는 car, cdr을 구현한다.
  • integer object를 생성하는 mkint를 구현한다.
  • symbol object를 생성하는 mksym을 구현한다.

 

구현

Object의 Type, Value 둘 다 출력하는 Detail version과 Testing 결과를 출력하는 Testing version이 있다.

Refference 문서에 나온 Testing 방법과 자체적으로 테스트하고자 만든 YR Test 두가지로 테스트하였다.

# Data Type
#   1: int
#   2: pair(in python, Tuple)
#   3: nil(in python, None)
#   4: symbol

Types = ['Int', 'Pair', 'Nil', 'Symbol']

class Data:
    def __init__(self, type=0, value=0):
        self.type = type
        self.value = value
    def car(self):
        return self.value[0]
    def cdr(self):
        return self.value[1]
    def __str__(self):
        if self.type == 2:
            # detail ver.
            # return "Object [Type: "+Types[(self.type)-1]+", Value: ("+str(self.car())+", "+str(self.cdr())+")]"
            # testing ver.
            return "("+str(self.car())+", "+str(self.cdr())+")"
        else:
            # detail ver.
            # return "Object [Type: {type}, Value: {val}]".format(type=Types[(self.type)-1], val=self.value)
            # testing ver.
            return str(self.value)
        #return "babo~ya"

def cons(d1, d2):
    return Data(2, (d1, d2))    # type 2: pair

def mkint(n):
    return Data(1, n)   # type 1: int

def mksym(s):
    return Data(4, s)

def nil():
    return Data(3, None)

if __name__ == "__main__":
    print("========YR TEST========")
    print(cons(1, 5))
    print(cons(1, 5).car())
    print(cons(1, 5).cdr())
    print(mkint(3))
    print(mksym('ABC'))
    print(nil())
    print("========TESTING========")
    print(mkint(42))
    print(mksym("FOO"))
    print(cons(mksym("X"), mksym("Y")))
    print(cons(mkint(1), cons(mkint(2), cons(mkint(3), nil()))))

좌: Detail ver. 우: Testing ver.

하지만 위의 방법으로는 두가지 문제점이 있다.

먼저, pair를 출력할 때 여러 pair를 중첩시켜 만든 것이 그대로 나타난다. 기대하는 예상결과는 (1, (2, (3, None))) 이 아닌 (1, 2, 3)이다.

두번째로, nil type의 값을 None이라 정의해주었기때문에 str(self.value)를 통해 None이라 출력된다. 하지만 예상하는 결과는 nil일 경우 무시하는 것이다.

 

이런 문제점을 해결하기위해 코드를 수정했다. Refference의 C코드를 최대한 Python으로 포팅하고자 했고 결과는 다음과 같다.

# Data Type
#   1: int
#   2: pair(in python, Tuple)
#   3: nil(in python, None)
#   4: symbol

Types = ['Int', 'Pair', 'Nil', 'Symbol']

class Data:
    def __init__(self, type=0, value=0):
        self.type = type
        self.value = value
    def car(self):
        return self.value[0]
    def cdr(self):
        return self.value[1]
    def __str__(self):
        if self.type == 2:
            try:
                if(self.cdr() == int(self.cdr())):
                    return "("+str(self.car())+" . "+str(self.cdr())+")"
            except:
                retStr = '('
                retStr+=str(self.car())
                atom = self.cdr()
                while(str(atom) != 'None'):
                    if(atom.type == 2):
                        retStr+=' . '
                        retStr+=str(atom.car())
                        atom = atom.cdr()
                    else:
                        retStr+=' . '
                        retStr+=str(atom)
                        break
                retStr+=')'
                return str(retStr)

        else:
            return str(self.value)
        #return "babo~ya"

def cons(d1, d2):
    return Data(2, (d1, d2))

def mkint(n):
    return Data(1, n)

def mksym(s):
    return Data(4, s)

def nil():
    return Data(3, None)

if __name__ == "__main__":
    print("========YR TEST========")
    print(cons(1, 5))
    print(cons(1, 5).car())
    print(cons(1, 5).cdr())
    print(mkint(3))
    print(mksym('ABC'))
    print(nil())
    print("========TESTING========")
    print(mkint(42))
    print(mksym("FOO"))
    print(cons(mksym("X"), mksym("Y")))
    print(cons(mkint(1), cons(mkint(2), cons(mkint(3), nil()))))

첫번째 문제를 해결해서 pair가 예상결과대로 깔끔하게 나온다. 하지만 nil의 출력값을 None값으로 어떻게 만들어줘야할 지는 해결하지못했다. __str__에 None을 출력할 수 없고 공백문자로 대체할 수도 없다면 어떤 방법을 써야할까?

다음 수업때의 이카루스(Me!)가 해결해주리라 믿는다.

 

 

Refference

lwh.jp/lisp/data.html

'kos' 카테고리의 다른 글

Lab 1.2: 구문 분석기  (0) 2021.04.08
Lab 1.1[박인철]: Data 만들기  (0) 2021.04.06
Lab 1.1[최준혁]: Data 만들기  (0) 2021.04.06
Lab 1.1: Data 만들기  (0) 2021.04.06
Scheme 구현 팀블로그에 오신 것을 환영합니다.  (0) 2021.04.05
Comments