목록전체 글 (31)
PL λαβ
env를 먼저 만들려고 하다가 어떻게 해야될지를 잘 몰라서 일단 미완성 코드라도 올려놓겠습니다 ㅠㅠ from enum import Enum import math import operator as op class Type(Enum): NIL = 0 INT = 1 REAL = -2 SYM = -1 PAIR = 2 class ErrorType(Enum): UNEXPECTED_TOKEN = 'Unexpected Token' ID_INVALID_TOKEN = 'invaild type' NO_INPUT_FILE = 'No Input File' class Error(Exception): pass def Err(token, type): raise Error("{0} : {1}".format( str(type), str..

지난번 구현했던 환경 부분을 완성하였고, 이어서 built-in 함수 car, cdr, cons를 환경에 추가하여 호출을 테스트해보는 부분까지 어느정도 완성했습니다. 기본적으로 참고 페이지(www.lwh.jp/lisp/index.html)의 진행을 따라하는 방식으로 진행하였지만, env는 python class로 구현되었고, 나머지 실행 중 막히는 부분들은 일부 변형하였습니다. Data 관련 코드는 조교님이 작성해주신 boilerplate를 거의 그대로 사용했지만 필요에 따라 조금 수정하였습니다. environment_mark2.py from boilerplate import * from builtin_function import * class Bindings: def __init__(self, pare..

# 진행상황 Built-in 함수 c* 패밀리를 만드는 데 성공했지만 이전 Lab에서 만든 환경이 제대로 구축되지 않았지때문에 프로그램 초반에 환경을 설정하는 부분이 작동하지 않는다. 우선은 Built-in 함수가 잘 작동하는 지 보기위해 환경 설정 없이 바로 보내주도록 코드를 짰고(built-in이란 말이 무색하다...) 아래와 같이 동작한다. foo와 bar를 이용해 cons함수가 잘 만들어지지만 출력하는 부분에서 foo, bar의 값이 아닌 foo, bar symbol name이 출력된다. 이 부분 또한 보완이 필요하다. # Result ===== Init Symbol Table ===== ['Nil', {'cons': , 'car': , 'cdr': }] ======= Program Start =..
# 기본 함수 모든 언어에는 기본 함수(built-in function)가 있습니다. 적어도 사칙 연산과 조건 연산자 등은 최소한 필요합니다. Lisp의 경우 cons, car, cdr 등을 기본 함수로 처리할 수 있습니다. 이러한 기본 함수는 초기 환경에 들어가야 합니다. #초기 환경 초기 환경을 구현하기 위해 Lisp 형태의 환경을 봅시다. c* 삼형제만 생각하면 다음과 같은 환경을 구성해야 합니다. (Nil (cons . cons_함수) (car . car_함수) (cdr . cdr_함수)) 즉 위 환경이 초기 환경의 예라고 할 수 있습니다. #Lisp의 기본 함수 기본 함수도 Lisp의 함수라는 것을 기억합시다. 먼저 Lisp의 함수 정의를 생각해 볼까요? (define f (lambda (x y..
안녕하십니까? 공학 실습 과목 조교 김민성입니다. 수강생 분들의 코드를 보고 고민과 노력이 담겨 있다는 생각이 들었읍니다. 다름이 아니라, 좀 더 신속한 개발을 위해 파서와 렉서에 대한 코드를 제공하고자 하오니 아래 코드를 참고 후 인터프리터 개발에 효율적으로 쓰였으면 합니다. 수강생 여러분들의 코드를 적절하게 섞고자 하니, 각자 개성이 있어 어려움이 있었으나 최대한 각자의 좋은 점을 많이 담고자 노력했읍니다. from enum import Enum class Type(Enum): NIL = 0 INT = 1 REAL = -2 SYM = -1 PAIR = 2 class ErrorType(Enum): UNEXPECTED_TOKEN = 'Unexpected Token' ID_INVALID_TOKEN = 'i..

진행상황 (define $1 $2) (quote $1) 에 대한 케이스만 정의된 상태입니다. 재귀적으로 순환하며 PAIR 안의 PAIR를 분석하는 기능을 추가해야합니다. 그리고 처음 [부모, 자식] 환경을 생성한 뒤 자식을 추가하는 방식으로 수정해야합니다. 현재는 자식들에 대한 딕셔너리만 정의해 사용하고있습니다. 또한 기존에 여러 라인에 걸쳐 한번의 입력만 받는 것에서 구조를 수정해 한 라인의 입력을 여러번 받을 수 있게 하였습니다. 하지만 이 구조에서는 여러 라인이 들어오는 경우에 대해선 처리하지못하기에 이전 구조와 현재 구조를 합칠 방법을 고안해야합니다. Result Code from enum import Enum class Type(Enum): NIL = 0 INT = 1 PAIR = 2 SYMBO..
오늘 강의 내용 바탕으로 환경 코드 구성한 내용입니다. from data_mark2 import Data, cons class Symbols: def __init__(self, parent): self.parent = parent self.symbols = dict() self.children_list = [] # 부모 -> 자식으로 찾는 경우 대비 def add_symbol(self, symbol, value): self.symbols[symbol] = value def add_child(self, child): self.children_list.append(child) if __name__ == "__main__": symbol_list = [] symbol_list.append(Symbols(par..

~ Completely Unfinished ~ Code from enum import Enum class Type(Enum): NIL = 0 INT = 1 PAIR = 2 SYMBOL = 3 class Data: def __init__(self, type=Type.NIL, 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 == Type.NIL: return "NIL" elif self.type == Type.PAIR: try: if(self.cdr() == int(self.cdr())): ..