| 이전 주제 보기 :: 다음 주제 보기 |
| 글쓴이 |
메시지 |
장민석
가입: 2006년 9월 5일 올린 글: 165
|
올려짐: 2006년9월26일 1:53 주제: run 함수값(리턴값) type 정의가 좀 어색합니다. |
|
|
| 이희종 씀: |
뼈대에는 run함수가 무조건 1을 리턴하고 이것을 화면에 표시하지만 실제 구현하실 때는 run함수의 리턴값을 화면에 표시하시면 안됩니다. |
뼈대에서도 run이 실행되었을 때 1이 출력되는 것은 아니지 않습니까? 궁극적으로 어떤 값이 화면에 출력되기 위해서는 run은 무조건 unit값을 가져야 하는 것 아닌가요?
그런데 KEVAL에 run의 함수값 type이 value로 고정되어 있습니다. 그러므로 value는 unit type이어야 한다는 얘긴데요. 이런 맥락에서는,,
| 코드: | | type memory = value Mem.t |
와 같이 정의하는 것은 넌센스가 되어 버립니다.
저 같은 경우는 KEVAL은 건드리지 않았지만, Keval에 내부 함수와 새로운 타입value_a를 정의하여 구현했습니다.
또한 위와 같은 맥락에서는 v2s 또한 무의미한 함수가 되어 버립니다. v2s는 value-> string 함수이고 모듈 타입에 정의된 의도는 아마도 출력에 써먹기 위함이었을 것입니다. 하지만 value는 동시에 run의 함수값 타입이기 때문에 unit이어야만 합니다. 즉 v2s: unit->string 함수가 되어버려 원래 의도했음직한 v2s:int->string와는 차이가 있습니다. 저같은 경우엔 역시 v2s_a를 따로 정의하여 써먹었습니다.
결론적으로 run: memory * env * program -> unit 이 되는 것이 더 합리적이 아닌가 생각합니다. 물론 지금 와서 스펙이 바뀌면 안되겠지만요 ^^;; |
|
| 위로 |
|
 |
이희종
가입: 2006년 3월 7일 올린 글: 50
|
올려짐: 2006년9월26일 13:37 주제: |
|
|
뼈대의 구현이 좀 혼동되게 되어있었던 것 같습니다.
뼈대에서는 run함수가 무조건 1을 리턴하고 이 리턴값을 v2s 함수로 string으로 바꾼 후
화면에 표시하게 되어있습니다. 이것은 단순히 뼈대의 동작을 보여주기 위한 것이며
실제 구현하실 때는
value 타입을 int, true, false, unit을 모두 포섭할 수 있도록 정의하시고 run함수를 불러
반환되는 값은 ignore 등의 함수를 사용하여 화면에 표시하지 않고 그냥 무시하시면
됩니다.
| 인용: | | 결론적으로 run: memory * env * program -> unit 이 되는 것이 더 합리적이 아닌가 생각합니다. 물론 지금 와서 스펙이 바뀌면 안되겠지만요 ^^;; |
run: memory * env * program -> unit으로 정의해도 무리는 없습니다만 1+1과 같은
프로그램이 아무것도 하지 않는 프로그램이 되겠죠.
run: memory * env * program -> value로 정의한다면 리턴값으로 2가 나오게 될거구요.
물론 이값은 이번 숙제에서는 사용하지 않으므로 화면에 표시되지 않고 무시되겠지만요. |
|
| 위로 |
|
 |
장민석
가입: 2006년 9월 5일 올린 글: 165
|
올려짐: 2006년9월26일 17:03 주제: |
|
|
1) 아...main.n을 보니 정말 그렇게 되어 있네요.
그런데 반드시 제공된 뼈대에 적합하도록 짜야 하나요?
저의 경우에는 2.n만 보면서 짜고 있는데요. 단순히 Keval.run을 실행했을 때 인자로 입력된 프로그램이 제대로 실행되도록만 구현하였습니다. 예를 들어 | 코드: | | WRITE(ADD(NUM 1, NUM 2)) | 같은 프로그램을 인자로 받으면 run은 화면에을 출력하고 정지하는데요. 그냥 이 조건만 충족시키면 안 되나요?
2)
| 인용: | | value 타입을 int, true, false, unit을 모두 포섭할 수 있도록 정의하시고 run함수를 불러 반환되는 값은 ignore 등의 함수를 사용하여 화면에 표시하지 않고 그냥 무시하시면 됩니다. |
라고 하셨는데, 사실
| 코드: | | type value = int | bool | unit | 이런 식으론 안 되니까
| 코드: | | type value = Val of int ... | 뭐 이런 식으로 해야 할 텐데요. 이렇게 한번 껍질을 덧씌웠을 경우, Keval.run의 리턴값이 value 타입으로 되어 있는지라 프로그램을 실행하기가 좀 난감해지는 문제가 있습니다. 예를 들어 뭔가 출력을 하는 프로그램의 경우 함수값인 value 타입이 unit이어야 할 텐데, value 타입이 Unit of unit 같은 식으로 되어 있으면 run을 실행해도 아무일도 안 일어나지 않습니까?
실은 이것은 nML 자체에 대한 질문일 수도 있는데요. 그러니까 C언어같은 경우는 함수 A 내부에서 프로시저 p를 돌릴 경우 A의 리턴값에 상관없이 p가 동작하지 않습니까? 반면 nML에서는 프로시저 p를 돌리기 위해선 함수 A의 함수값 자체가 p(x)와 같은 게 되어야 하는데요. 제가 아직 nML에 익숙하지 않아서인지 모르겠지만 상당히 불편하게 느껴집니다. |
|
| 위로 |
|
 |
장민석
가입: 2006년 9월 5일 올린 글: 165
|
올려짐: 2006년9월27일 20:23 주제: |
|
|
; 를 사용하면 함수 정의 내에서 sequence를 구현할 수 있군요. 그럼 출력에도 아무 문제가 없네요...
이런 간단한 문법을 몰라 계속 헛소리를 해댔습니다 ㅠ.ㅠ |
|
| 위로 |
|
 |
|