 |
|
| 이전 주제 보기 :: 다음 주제 보기 |
| 글쓴이 |
메시지 |
최정원
가입: 2025년 3월 22일 올린 글: 29
|
올려짐: 2026년5월27일 21:25 주제: [숙제 7] 1, 2 상수 변환 질문 |
|
|
안녕하세요, 숙제 7과 관련하여 전반적으로 질문이 있어 여쭤봅니다.
1. 문제 1의 경우, 상수 Fn과 Fnr은 람다식으로 Y 함수를 써서 풀어쓴 형식이 아니라, Num 이랑 Var이랑 마찬가지로 \k..k (Fn (x, e) 그대로 돌려주어도 되는 것인가요? 함수와 재귀함수의 내부에 있는 e를 꺼내서 cps로 변환할 필요는 없는 것이죠?
2. 문제 2의 exn 폴더의 xexp.ml 파일에서 eval의 App (e1, e2) 에 있는 | 인용: | | e2 must be evaluated only if e1 is evaluated to a value | 주석은 app에만 해당하는 특수한 케이스인가요, 혹은 이후의 subexpression이 있는 경우는 모두 포함되나요? 또한, 이 문구를 염두에 두고 xcps 변환을 해야하는지 xexp에만 해당하는 주석인지 알고 싶습니다.
3. 문제 2의 경우, exn 함수의 [main.ml] 함수를 살펴보면 처음 cps_result를 run할 때 이미 | 인용: | | App (input program, Pair (Fn (v, Var v), Fn (v, 2026))) | 의 형태입니다.
이때 프로그램이 만약 단순히 ‘2’를 돌려주는 거라면 xcps’ 로 변환된 상수 (Num, Var, Fn, Fnr) 프로그램이 꼭 다시 한 번 Pair의 형태를 가져야 할까요? 만약 상수가 돌려주는 함수인 input program에 인자로 들어오는 Pair의 첫번째 인자임을 나타내는 형태(Fn (k, App (Fst (k), 상수)) 꼴로 상수를 돌려주면, CPS-coverted Program의 형태는 (t → result) x (t’ → result)는 아니고 | 인용: | | fn x_1 => (x_1.1) (2) | 형태입니다. 그러나 결과는 정상적으로 나오며, 상수 자체가 더 이상 할 일이 없는 형태니 이렇게 결과를 전달하는 것도 가능한지 여쭤봅니다. 애초에 run 당시 pair을 이미 입력으로 상수 함수에 받고, 더 이상 할 나머지 일이 없으니 입력 받은 pair의 첫 번째 인자를 골라 상수를 apply 해주는 방식이 가능할 것 같습니다.
4. 문제 4번에서 check 함수를 rec으로 바꾸어도 되는지 알고 싶습니다.
질문 읽어주셔서 감사합니다. |
|
| 위로 |
|
 |
안중원 Site Admin
가입: 2023년 3월 13일 올린 글: 83
|
올려짐: 2026년5월28일 15:09 주제: |
|
|
안녕하세요, 프로그래밍 언어 조교 안중원입니다.
1. 상수 Fn과 Fnr은 cps 변환 후에 \k. k(Fn (x, ...))과 \k. k(Fnr (x, ...))의 형태가 되지만, 함수의 몸통은 다른 부분식(subexpression)들과 마찬가지로 cps 변환하여 사용해야 합니다. 즉, Fn (x, e)가 주어졌을 때 e를 그대로 쓰는 것이 아닌 cps e를 활용하여 변환 결과를 만들어야 합니다. 이 경우 변환 전후 타입이 정확히 t / (t -> result) -> result 로 대응되지는 않게 된다는 점에 유의하세요.
2. xcps에서 부분식(subexpression)이 있는 식은 모두 실행 순서상 앞의 식이 정상적으로 실행되는 경우에만 그 뒤의 식이 실행되도록 변환하여야 합니다.
3. 보여주신 결과식은 올바른 xcps 변환 결과이고, 그 타입은 PDF에 명시된 ((t -> result) * (t' -> result)) -> result 에서 t=int, result=int인 경우로 생각할 수 있습니다. 단순히 pair 타입이 아니라 pair를 받아 결과를 리턴하는 함수 타입임에 유의해주세요. 마지막에 설명해주신 내용("... 방식이 가능할 것 같습니다")을 보면 xcps 변환의 의미를 (적어도 상수 경우에 대해서는) 정확히 이해하고 계신 것 같습니다.
4. 네, 가능합니다.
감사합니다. _________________ TA 안중원
e-mail: jwahn@ropas.snu.ac.kr |
|
| 위로 |
|
 |
최정원
가입: 2025년 3월 22일 올린 글: 29
|
올려짐: 2026년5월29일 14:56 주제: |
|
|
답변 감사드립니다!
1 번의 경우, \k. k(Fn (x, 몸통 변환 ) 형태에서 함수 몸통을 cps' 로 변환하는 모습은 반드시 (cps' e) = \v....k 형태가 아니라도 될까요?
또한, 상수가 아닌 다른 exp들도 변환 형식의 가장 겉 부분만 \k..\v...k.... 의 형태를 가지면 안쪽 부분이나 사이 사이의 형태는 예시로 주신 Add의 형식과 달라도 상관 없을까요?
If (e1, e2, e3) 문에서 전체적으로 If 문이 최종적으로 evaluate 되기 전에 e2, e3 문이 먼저 continuation으로 evaluate 되는 경우, e2나 e3에 재귀문이 있을 시 무한 루프를 도는 것 같습니다. Add 예시의 경우에는 e1, e2를 차례대로 cps' 로 변환 후 v1, v2로 마저 할 일을 받았지만, If 문은 이와 비슷하게 e1, e2, e3를 차례대로 변환 후 v1, v2, v3로 넘겨준 다음 if 문을 실행하면 문제가 생기는 것 같습니다. 조건문 e1만 먼저 변환 후 Ifp로 넘겨주고, Ifp의 조건문이 evaluate 된 후 e2, e3의 cps' 형태가 실행될 수 있게 변환이 가능할까요?
위의 경우 nested 된 e1, e2, e3 cps' 변환이 아닌 \k..\v....k (Ifp (v, cps' e2, cps' e3)) 형태가 될 것 같은데 이 경우도 올바른 변환으로 볼 수 있을까요?
또한, Handle의 경우 변수 x에 대한 처리를 cps'에서 해야 할까요? |
|
| 위로 |
|
 |
최정원
가입: 2025년 3월 22일 올린 글: 29
|
올려짐: 2026년5월29일 21:15 주제: |
|
|
안녕하세요,
위 질문의 연장으로 여쭤보고 싶습니다. 2번의 Handle의 경우도, Handle 함수 자체가 evaluate 되기 전에 xcps’ e1이 evaluate 되면 무조건 raise가 작동되는 것 같은데, 이 경우 xcps’ e1과 xcps’ e2를 Handle 내부에서 모두 처리하는 꼴로 만들 수 있을까요? 이 방법을 사용하면 Handle은 상수랑 비슷한 형식(\k…k…)이 될 것 같은데, 허용이 되는지 알고 싶습니다.
\k_h….k_h (Handle (xcps’ (e1) \v….k…., x, xcps’ (e2) \v…k….)) 형태도 가능한지, Handle도 무조건 \k_h…\v….k_h의 꼴을 지켜야 하는지 알고 싶습니다.
거듭되는 질문에도 항상 답변 주셔서 감사합니다. |
|
| 위로 |
|
 |
안중원 Site Admin
가입: 2023년 3월 13일 올린 글: 83
|
올려짐: 2026년5월30일 2:15 주제: |
|
|
1. 몸통의 모양이 반드시 (cps e) 형태가 되어야한다는 제한은 없습니다. 다만 올바른 cps 변환이라면 (cps e) 형태의 식이 결과에 포함될 것입니다.
2. cps 변환의 핵심은 결과식의 모양 자체가 아니라, 각 부분식이 마저할일을 받아 계산을 수행하는 방식이 되도록 변환하는 것에 있습니다. 공지에 말씀드린 것은 올바른 cps 변환이라면 갖춰야할 최소한의 형태적 조건 내지는 힌트입니다. 각 문법마다 결과식의 구체적인 모양은 조금씩 다를 수 있습니다.
3. 조건문의 실행 순서가 잘 드러나도록 변환해주시면 됩니다. 조건식을 계산한 후의 마저할일이란 조건에 따라 적절한 식을 실행하여 그 결과를 조건문 전체의 마저할일에 넘겨주는 것이 됩니다.
4. 말씀하신 구체적인 형태에 관해 맞다 틀리다 답변을 드리기는 어렵습니다. 채점이 끝난 이후에도 cps 변환에 대해 의문점이 남아있으시다면 그때 답변을 드리도록 하겠습니다.
5. handle/raise에 관해서 주신 질문에는 답변을 드리기는 어려울 것 같습니다. 다만 xcps 변환이 올바르게 이루어진다면 결과식에는 실제로 handle 및 raise 식이 사라지게 된다는 점은 힌트를 드릴 수 있습니다. 예외처리가 “설탕”이라는 말은 이렇게 xcps 변환을 통해 제거할 수 있다는 의미입니다.
답변이 조금 늦었습니다만 과제를 하는 데에 도움이 되었기를 바랍니다. 감사합니다. _________________ TA 안중원
e-mail: jwahn@ropas.snu.ac.kr |
|
| 위로 |
|
 |
최정원
가입: 2025년 3월 22일 올린 글: 29
|
올려짐: 2026년5월30일 16:57 주제: |
|
|
자세한 답변 정말 감사드립니다.
아직도 말씀해주신 부분 중에 헷갈리는 것이 있는데,
1번의 경우, Fn, Fnr을 변환할 때 (cps e)가 어떤식으로든 존재하면 되며, 그 e가 원래 어떤 식이었든 간에 나머지 cps 식들의 번역이 잘 갖추어져 있다면 최종적으로 run을 통해 실행되는 변환 결과는 제대로 되어 있을 것이란 말씀이신가요?
2번 답변의 경우, 다른 분의 cps 문제 관련 질문에서는 k가 함수로 올 수도 있고 인자로도 올 수 있다고 말씀해주신 것 같은데, \k...\v...k...의 기본적인 형태에서 두 번째 k는 다른 함수를 받을 수도 있고(k a), 다른 함수 속에 들어갈 수도 있는 등(a k), 그 형태는 주어진 식의 마저할일 과정에 따라 달라질 수 있다는 말씀이신 거죠?
5번 답변에서는 xexp의 handle, raise를 사용하지 않아도, 마저 할일 변환을 통해 같은 효과를 내는 식을 만들 수 있다는 말씀이실까요?
마지막으로, xpcs' 함수에 k를 처리할 때 반드시 Fst (k), Snd (k)가 아닌 통째로 k를 불러도 되는지 알고 싶습니다. |
|
| 위로 |
|
 |
안중원 Site Admin
가입: 2023년 3월 13일 올린 글: 83
|
올려짐: 2026년5월31일 0:43 주제: |
|
|
1. 말씀하신대로 내부의 e에 어떤 식이 오든 Fn(x,e)의 cps 변환은 (cps e)를 사용하여 잘 이루어집니다. cps 변환을 일종의 번역으로 생각하시면 됩니다. 이러한 번역은 귀납적입니다. 즉 알고리즘 자체가 부분식(이를테면 e)의 번역 결과를 조합하여 전체식(이를테면 Fn(x,e))의 번역 결과를 만드는 방식으로 정의되고, 그 번역의 올바름도 “cps e가 올바른 번역이므로 Fn (x,e)를 번역한 Fn (k, …(cps e)…)도 올바른 번역이다”라는 식으로 귀납적으로 성립합니다.
그 올바름이 어떻게 정의되는지 부분적으로 살펴보자면, 결과값이 상수인 경우에 관해서는 숙제 및 공지에서 설명했듯 run ((cps e) (\v.v)) = run e가 성립해야 한다는 것입니다. 결과값이 함수인 경우의 번역의 올바름은 이번 숙제에서 직접 고민해볼 중요한 부분이니 힌트는 이 정도까지 드릴 수 있겠습니다.
2. 정확합니다. k의 사용이 꼭 (k a) 형태로만 제한되지는 않는다는 이야기였습니다.
3. xcps 결과에서 raise와 handle을 없애는 것이 가능한 것은 물론이고 오히려 없어져야 잘 번역이 된 것이라고 볼 수 있습니다. 마저할일 드러내는 변환을 통해 예외처리 문법을 사용하지 않는 식으로 원래 식과 똑같은 계산(혹은 실행의미, 부수효과 등)을 표현할 수 있다는 것이 해당 문제의 핵심입니다.
4. k를 사용하는 방식에 특별히 제한을 두는 것은 아닙니다. 다만 k가 pair 값인데도 App(k, …)로 사용이 된다면 실행중 타입에러가 날 수밖에 없을 것 같다는 의견입니다.
감사합니다. _________________ TA 안중원
e-mail: jwahn@ropas.snu.ac.kr |
|
| 위로 |
|
 |
최정원
가입: 2025년 3월 22일 올린 글: 29
|
올려짐: 2026년5월31일 11:40 주제: |
|
|
설명해주셔서 정말 감사합니다!
Pair을 받을 수 있는 함수에 k를 전달하는 것처럼 에러가 나지 않으면 사용법은 자유롭다고 생각하면 될까요? |
|
| 위로 |
|
 |
안중원 Site Admin
가입: 2023년 3월 13일 올린 글: 83
|
올려짐: 2026년5월31일 11:57 주제: |
|
|
네, 문법적으로 제한을 하고있는 것은 아닙니다. _________________ TA 안중원
e-mail: jwahn@ropas.snu.ac.kr |
|
| 위로 |
|
 |
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group Translated by kss & drssay
|