목록전체 글 (31)
PL λαβ
# Goal 주석 제거하기(한줄, 여러줄): 한줄 주석 제거 완료 키워드 한글 변환: 변환 완료 플러그인과 결합: Not Yet # Comment 여전히 tuple error를 해결하지 못하였습니다.. ({에러}*, 값) 형태의 튜플때문에 값에 접근하기 위한 cdr, car, type, value들이 다 tuple error 트리거가 되어서 구조를 파악해 제거해야할 것 같습니다. vscode 플러그인에 추가하는 건 아까 언급하신것처럼 인터프리터 따로 배포해서 설치후 extension에 적용한다 생각하고 진행하도록 하겠습니다. # Test >> (정의 한글 30) 한글 >> 한글 (, 30) >> (람다 (가) (+ 가 가)) [ENV class : root, ((가) . (+ . 가 . 가))] >> (..

Code 이때까지 구현했던 내용에서 키워드가 있는 부분들만 찾아 간단히 한글로 바꾸어주었습니다. 또한 주석을 구현하려고 보니 먼저 여러줄에 걸쳐 코드를 입력받는것이 먼저 필요할 것 같아 main문을 수정하여 구현하였습니다. 여러 줄에 걸쳐 입력할 때 Index Error가 발생하는 것을 이용해 파이썬 인터프리터와 비슷한 모양으로 만들어보려 했는데 이렇게 구현하는게 맞는진 잘 모르겠습니다. from boilerplate import * # from environment_mark2 import * class Bindings: def __init__(self, parent): self.parent = parent self.symbols = dict() def add_symbol(self, symbol, val..
Code 내장 비교 연산과 조건문까지 구현하였습니다. 마찬가지로 기본 진행방식은 참고 페이지를 따라하였고, 부분부분 파이썬에 맞도록 수정하였습니다. 계속 미루고 있었던 에러 리턴과 처리를 문자열로 통일하여 동작하도록 하였는데, 후에 이 부분은 Error class로 고치면 더 깔끔할것 같습니다. mycode.py from boilerplate import * # from environment_mark2 import * class Bindings: def __init__(self, parent): self.parent = parent self.symbols = dict() def add_symbol(self, symbol, value): if symbol.type == Type.SYM: self.symbo..

Comment If Statement: OK Equal, Less Builtin Function: OK Quote: Not yet Define: Not yet Test # IF Test >> (if t 3 4) ('Error_OK', (, 3)) >> (if nil 3 4) ('Error_OK', (, 4)) >> (if 0 t nil) ('Error_OK', (, T)) # Equal Test >> (= 3 3) ('Error OK', ('Error OK', T)) >> (= 3 4) ('Error OK', ('Error OK', NIL)) # Less Test >> (> (< 4 11) ('Error OK', ('Error OK..
Comment www.lwh.jp/lisp/lambda.html 페이지를 참고하여 C코드를 Python코드로 포팅한다는 느낌으로 만들었습니다. 차근차근 따라하다보니 개념은 이해가 되었지만 lambda가 한번 나오는 것이 아닌 여러번 나오는 문장을 해석하는 방법에 대해서는 아직 고민중이라 완성된 코드는 아닙니다. lambda의 cdr이 lambda면 다시 재귀하는 방법을 취해야할 것 같습니다. 만들다보니 신기하네요 람다의 세계는 Code 바뀐 부분의 코드만 기재하였습니다. ... def env_get(env, symbol): parent = env.parent if symbol.value.upper() in env.symbols: return env.symbols[symbol.value.upper()] i..
Code 모듈로 나누어서 작업을 하다가 모듈끼리 circular import 문제가 생겨, 조교님이 작성해주신 boilerplate 코드와 아래 코드, 두 모듈로 이전의 코드들을 합쳐서 작업하였습니다. 전체적인 흐름은 이전처럼 참고 페이지(www.lwh.jp/lisp/index.html)대로 따라갔고, 파이썬과 맞지 않는 부분들을 조금씩 수정하는 방식으로 진행했습니다. 여전히 리턴 때마다 에러와 결과값을 함께 튜플로 리턴해주는 방식을 사용하고 있지만 튜플을 unpacking하는 부분이 제대로 되어있지 않거나, 에러 타입이 깔끔하게 정리되지 않고 문자열로 전달해버리는 부분들이 많아 정리가 필요합니다. from boilerplate import * # from environment_mark2 import *..

Comment 조교님과 최준혁선배님의 코드를 합쳐 환경과 기본함수를 수정한 뒤 사칙연산 함수를 추가했습니다. Result Code 코드가 500줄이 넘어가는 관계 상 추가한 부분만 올립니다. 전체코드는 github.com/icaruswithoutwings/CrazyRichWeekendFarm 에서 확인할 수 있습니다. def builtin_plus(args): if (args.car().type == Type.INT) and (args.cdr().car().type == Type.INT): var = (args.car().value) + (args.cdr().car().value) return "Error OK", mkint(var) return "Error Args", nilp() def builtin..
# 람다 구문 람다 구문은 함수를 나타내기 위한 구문입니다. 람다 구문의 형태는 다음과 같습니다. (lambda (param ...) expr) 여기서 param ...은 매개변수 이름 목록이며 expr은 함수의 본체를 나타내는 수식입니다. 문제는 expr 내에 비지역 변수가 있을 수 있다는 점인데, 이를 해결하기 위해 람다식을 만나면 클로저(closure)를 만들어 둡니다. # 클로저 클로저는 환경과 함수를 합친 형태의 것으로서, 적절한 개수의 인수만 주어진다면 값을 구할 수 있는 형태입니다. 클로저도 리스트로 표현할 수 있는데 클로저는 현재 환경을 추가한 함수 형태입니다. (env (param ...) expr) 외형적으로만 보면 람다 구문에서 lambda 대신 env가 들어간 형태입니다. # 변경해..