{"action":"created","issue":{"url":"https://api.github.com/repos/swmaestro06-apus/apus/issues/86","labels_url":"https://api.github.com/repos/swmaestro06-apus/apus/issues/86/labels{/name}","comments_url":"https://api.github.com/repos/swmaestro06-apus/apus/issues/86/comments","events_url":"https://api.github.com/repos/swmaestro06-apus/apus/issues/86/events","html_url":"https://github.com/swmaestro06-apus/apus/issues/86","id":102625510,"number":86,"title":"Context Chaining을 어떤 방식으로 하는게 좋을까요","user":{"login":"enghqii","id":2420985,"avatar_url":"https://avatars.githubusercontent.com/u/2420985?v=3","gravatar_id":"","url":"https://api.github.com/users/enghqii","html_url":"https://github.com/enghqii","followers_url":"https://api.github.com/users/enghqii/followers","following_url":"https://api.github.com/users/enghqii/following{/other_user}","gists_url":"https://api.github.com/users/enghqii/gists{/gist_id}","starred_url":"https://api.github.com/users/enghqii/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enghqii/subscriptions","organizations_url":"https://api.github.com/users/enghqii/orgs","repos_url":"https://api.github.com/users/enghqii/repos","events_url":"https://api.github.com/users/enghqii/events{/privacy}","received_events_url":"https://api.github.com/users/enghqii/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/swmaestro06-apus/apus/labels/help%20wanted","name":"help wanted","color":"159818"},{"url":"https://api.github.com/repos/swmaestro06-apus/apus/labels/vm","name":"vm","color":"5319e7"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":2,"created_at":"2015-08-23T14:27:18Z","updated_at":"2015-08-23T14:44:25Z","closed_at":null,"body":"현재 변수 테이블을 어디에 둘지 고민중인데, 제 생각은 이렇습니다.\r\n\r\n1 . 변수테이블을 VM이 아니라 Context에 둡니다. \r\n\r\n2 . Block이나 Function을 실행시킬때 (얘도 Block이죠 사실) 가지고 있는 Context를 그냥 넘겨주지 않고 @namhyung 전에 말씀하신것 처럼 새로운 자식 Context객체를 만들어 넘깁니다. \r\n\r\n+ Variable,Function을 검색할때 쓰기 위해 Context::FindVariable(), Context::FindFunction()같은 멤버 함수를 제공해줘야 할것 같습니다. 각 함수들은 부모들을 따라가면서 변수, 함수들을 찾겠죠.\r\n\r\n3 . 자식 Context 객체를 만들때 **DataTypeTable은 shallow copy, FunctionTable과 Variable Table은 deep copy합니다** 그리고 **부모 Context에 있는 Parameter**( shared_ptr Value의 list 타입으로 생각하고 있습니다)**에서 부터 값들을 가져와, 현재 Context의 VariableTable에 그 값들을 가지는 Variable객체를 생성해서 넣어줍니다**  \r\n\r\nFunctionExpression에서 위 행동은 parameter passing이 될 것이고, 그냥 블록을 실행할때는 아무 의미 없는 행동이 될겁니다. 그땐 parameter 리스트 사이즈가 0일테니까요.\r\n\r\n4 . 블록이 끝날때, 자식 Context에서 부모 Context로 (만약에 있다면) return_value를 가져옵니다. 이것 역시 그냥 block에서는 아무 의미 없을것입니다. FunctionExpression에서는 이 return_value를 Evaluate의 return 값으로 사용합니다.\r\n\r\n\r\n```c++\r\n\r\nshared_ptr<Value> FunctionExpression::Evaluate(Context& context) {\r\n    Function func = context->FindFunction(name_);\r\n\r\n    // 여기에서 현재 Context에 parameter를 설정합니다. 그리고\r\n\r\n    Context child = context->BlockBegin(); // 여기에서 3. 행동을 합니다.\r\n    func->Execute(child);\r\n    child.BlockEnd(); // 여기에서 4. 행동을 합니다.\r\n\r\n    return context.return_value_; \r\n}\r\n\r\n```\r\n\r\n이쯤 될것 같군요. 이러면 제 생각에는 Block을 고치지 않고 && context 리스트를 구성하면서 && 함수 호출도 할 수 있을것 같습니다."},"comment":{"url":"https://api.github.com/repos/swmaestro06-apus/apus/issues/comments/133852618","html_url":"https://github.com/swmaestro06-apus/apus/issues/86#issuecomment-133852618","issue_url":"https://api.github.com/repos/swmaestro06-apus/apus/issues/86","id":133852618,"user":{"login":"enghqii","id":2420985,"avatar_url":"https://avatars.githubusercontent.com/u/2420985?v=3","gravatar_id":"","url":"https://api.github.com/users/enghqii","html_url":"https://github.com/enghqii","followers_url":"https://api.github.com/users/enghqii/followers","following_url":"https://api.github.com/users/enghqii/following{/other_user}","gists_url":"https://api.github.com/users/enghqii/gists{/gist_id}","starred_url":"https://api.github.com/users/enghqii/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enghqii/subscriptions","organizations_url":"https://api.github.com/users/enghqii/orgs","repos_url":"https://api.github.com/users/enghqii/repos","events_url":"https://api.github.com/users/enghqii/events{/privacy}","received_events_url":"https://api.github.com/users/enghqii/received_events","type":"User","site_admin":false},"created_at":"2015-08-23T14:44:25Z","updated_at":"2015-08-23T14:44:25Z","body":"아 제가 글을 잘못썼네요. Deep copy가 아니라 '새로 생성'입니다. 자식을 만들때 DataTypeTable은 최상위 부모에 있는 단 하나의 테이블을 가리키게 하고, 변수 & 함수 테이블은 블록에 들어갈때 하나씩 만들고 나올때 삭제 됩니다.\r\n\r\n블록 내부에서 생성된 변수나 함수(이건 없을것 같네요)들을 한꺼번에 지워주기 위함입니다."}}