게시판 인덱스

 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

[숙제 3] 입력 인자 eval 순서 질문

 
글 쓰기   답변 달기     게시판 인덱스 -> 4190.310 Programming Languages (Spring 2026)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
최정원



가입: 2025년 3월 22일
올린 글: 14

올리기올려짐: 2026년4월6일 15:12    주제: [숙제 3] 입력 인자 eval 순서 질문 인용과 함께 답변

안녕하세요, 숙제 3과 관련하여 질문드릴 게 있습니다.

1.
기본 연산과 비교 syntax의 경우 (ADD, SUB, MUL, DIV, EQUAL, LESS) 제공해주신 pdf에는 입력 인자로 들어오는 expression 중 두 번째 expression (e2)를 먼저 eval 을 통해 메모리를 변화시킨 다음 첫 번째 expression (e1)을 eval하는 것 같습니다.

예를 들어 아래 ADD의 경우 e2를 먼저 처리하고 그 메모리 M1으로 e1을 처리하는 것으로 판단했습니다. 그러나 일반적으로 식을 풀 때는 ADD (e1, e2)와 같이 입력이 들어오면 (e1 + e2)을 해결할 때 e1을 먼저 처리할 것 같아 헷갈립니다.

인용:
σ, M ⊢ e2 ⇓ n2, M1 σ, M1 ⊢ e1 ⇓ n1, M2
_________________________________

σ, M ⊢ e1 + e2 ⇓ n1 + n2, M2


다음과 같은 코드는 e2를 먼저 처리하느냐 e1을 먼저 처리하느냐에 따라 결과가 다릅니다.

코드:
let x := 1 in
let y := (x := 2) + x in
write y


만약 pdf와 같이 e2를 먼저 처리하는 것으로 k.ml을 짜면 결과는 3입니다. 즉, eval mem env e2를 먼저 하고 그 결과로 나온 mem1으로 eval mem1 env e1 를 다음에 하는 겁니다. 그러나 e1, 그리고 e2 차례대로 처리하는 것으로 짜면 결과는 4입니다. (eval mem env e1 다음에 eval mem1 env e2)

(x := 2)라는 expression이 덧셈식의 뒤 x에도 적용이 되는지 안 되는지의 차이인 것 같습니다.

결국
(1) 제공된 pdf에서 e2를 먼저 처리하고 그 메모리 M1으로 e1을 처리하는 것처럼 해석하는 것이 정확하고 이에 따라 코드를 작성하는 것
(2) 일반적으로 식을 풀 때 e1, e2 순서대로 분석하는 것처럼 e1을 먼저 처리하고 그 메모리로 e2를 처리하는 것

위 두 방식 사이에서 어떤 것을 따라야 하는지 여쭤보고 싶습니다. 어떻게 하느냐에 따라 테스트 케이스에서 다르게 나올 수도 있을 것 같아서 궁금합니다.

2. 두 번째 질문은 언제 type error을 발생시켜야 하는지에 관한 것입니다. pdf에서 n 혹은 n1, n2으로 결과 value가 명시되어 있으면 무조건 type이 num인 것으로 생각하여 value_int를 통해 type checking을 해야 할까요? value가 b (불리언)으로 명시되어 있을 때도 마찬가지인지 궁금합니다. 반대로 단순히 v, v1, v2 등으로 나와 있으면 굳이 value_int, value_bool을 통해 type checking을 할 필요가 없는지 알고 싶습니다.

3. if, while 문의 경우 들어오는 조건문이 무조건 불리언으로 eval 될 수 있다고 판단하면 될까요? 예를 들어 if (2 + 3) then ... 과 같이 조건이 덧셈식인 경우 비교를 통해 참 거짓을 알 수 없습니다. 이때 자동으로 조건이 false로 나오게 하는 게 맞나요 type error가 나오게 하는 게 맞나요?

긴 질문 읽어주셔서 감사합니다.
위로
사용자 정보 보기 비밀 메시지 보내기
신채환
Site Admin


가입: 2024년 3월 6일
올린 글: 24

올리기올려짐: 2026년4월6일 19:45    주제: 인용과 함께 답변

안녕하세요? 조교 신채환입니다.

1. PDF 파일에서 적힌대로 하는 것이 옳습니다. 해당 예시에서는 오른쪽 `x`부터 실행하여 `3`이 나오는 것이 맞습니다.

2. 실행 의미가 정의되어 있지 않은 상황이 발생할 때 예외를 발생시키면 됩니다. 이때 어떤 값이 다른 타입이었으면 실행 의미가 정의된다면 타입 에러를 발생시킵니다.

얘를 들어, `if`와 `then` 사이에 정수 값이 들어갔다면, 실행 의미가 PDF 파일에 정의되어 있지 않으니 예외를 발생시켜야 합니다. 그런데 해당 값이 참 또는 거짓이었다면 실행 의미가 정의되어 있었을 것이므로 타입 에러를 발생시켜야 하는 것입니다.

정리하자면, 오류를 발생시켜야 하는지는 PDF에 해당 상황이 정의되어 있는지에 따라 결정되고, 그 중 특정한 상황에서는 특정한 에러를 발생시켜야 한다고 생각하시면 됩니다.
위로
사용자 정보 보기 비밀 메시지 보내기
최정원



가입: 2025년 3월 22일
올린 글: 14

올리기올려짐: 2026년4월6일 21:24    주제: 인용과 함께 답변

답변 감사드립니다!

2번에서 말씀해주신 게 아직 살짝 헷갈리는데, if (정수) then 처럼 실행 의미가 pdf에 정의되어 있지 않은 경우는 타입 에러가 아니라 다른 종류의 에러를 발생시켜야 한다는 말씀이신가요? if (참/거짓) then의 경우는 실행 의미가 정의되어 있음에도 타입 에러가 나야한다는 부분을 잘 이해 못하겠습니다ㅠㅠ

두 가지 더 여쭤보고 싶은데, LET의 정의에서 ℓ 6∈ domM1 도 따로 식이나 함수를 이용해 확인하는 과정을 거쳐야 하는지, binding을 하는 과정에서 자연스럽게 될 수밖에 없는 것인지 알고 싶습니다. 따로 이를 확인하는 방법이 있는지 확실하지 않지만, 적용하려 하지 않아도 작동하는 것 같아 여쭤봅니다.

마지막으로 " _ -> failwith "Unimplemented" (* TODO : Implement rest of the cases *)" 코드는 마지막에 삭제하면 되는지, 그리고 Bool.not 모듈을 써도 되는지 알고 싶습니다.

다시 한 번 답변해주셔서 정말 감사합니다!
위로
사용자 정보 보기 비밀 메시지 보내기
신채환
Site Admin


가입: 2024년 3월 6일
올린 글: 24

올리기올려짐: 2026년4월6일 21:32    주제: 인용과 함께 답변

정확히는 `if` (정수) `then` 꼴이 나왔을 때, 만약 중간의 값이 참 또는 거짓이었으면 정상적으로 정의가 되었을 것이므로, 타입 에러를 발생시켜야 한다는 뜻이었습니다. 즉 실행 의미가 정의되지 않은 상황에서, 타입만 고치면 괜찮아지는 경우에 타입 에러를 낸다고 생각하시면 될 것 같습니다.
위로
사용자 정보 보기 비밀 메시지 보내기
신채환
Site Admin


가입: 2024년 3월 6일
올린 글: 24

올리기올려짐: 2026년4월6일 21:51    주제: 인용과 함께 답변

추가 질문에 대해 답변을 드리자면,

1. 주소 관련해서는 k.ml 파일에서 Memory signature 부분의 함수와 설명을 읽어 보시면 도움이 될 것 같습니다.

2. 해당 부분은 필요한 것을 모두 구현하셨다면 자동으로 지우라고 오류를 낼 것입니다. 그때 지우시면 될 것 같습니다.

3. 사용하셔도 됩니다.
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
글 쓰기   답변 달기     게시판 인덱스 -> 4190.310 Programming Languages (Spring 2026) 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
Translated by kss & drssay