PL λαβ
Lab 1.1[김예령]: Data 만들기 본문
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()))))
하지만 위의 방법으로는 두가지 문제점이 있다.
먼저, 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
'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