<commit_before># scope

## scope은 3종류로 분류한다.
* global scope 은 전역변수와 모든 origin객체가 놓여진다.
* object scope 은 객체 1개에 대한 멤버들이 등록된다.
* local scope 은 메소드 실행 도중에 발생하는 객체들이 등록된다.

## 모든 객체는, 자신이 메소드를 처리할때 scope을 갱신하려고 한다.

## 일반 객체는 자신이 가진 member로 object scope을 교체하고 localscope을 비운다.

## 메소드는 local scope을 추가한다.

## 메소드는 실행 도중에 변수의 정의가 나오면 local scope에 추가한다.

## scope는 외부에서 제네릭객체에 접근한다는 사실을 판별해야 한다.

* 제네릭 객체에 접근하려고 하고 있으며, 그 generic 객체가 아직 없다면 새로 unique객체를 만들어야 하기 때문에.
* 혹은 generic 객체에 접근할때의 이벤트를 외부에서 cb을 받을 수있게 하거나.
* generic의 unique객체를 만들때에는 일단 unique객체를 scope에 낑겨넣고 verfiication을 돌린다.
    * 다시 scope에 질의해서 무한 루프를 도는 걸 막아야 하기 때문이다.
    * verification이 실패시 넣었던 객체를 다시 지운다.

## 일반 객체는 정의를 scan 하는 과정과 verify 하는 과정 2PASS를 돌린다.

* 따라서 객체의 메소드를 정의할때 안에 구현에서 아직 나오지 않은 다른 메소드를 사용하더라도 문제가 없다.

## 메시지는 메시지를 처리하는 주체를 소유한 객체에게 전달된다.

```cpp
def a
    void print()
    void foo()
        print()
```
* 여기서 print() 는 this.print() 와 같은 것이다. print()를 소유한 객체는 foo 메소드가 아니라
  a 객체다.
* a 객체는 일반 객체이므로 자신이 가진 member인 print와 foo를 object scope에 등록한 후 local scope을 비운다.

## 위의 알고리즘을 따르면, 중첩 메소드도 해결된다.
```cpp
def a

    void foo()
        a := 35

        void print()
            a++
            b++ // err

        b := 5
        print()
```

* print()를 소유한 객체는 foo 메소드다. 따라서 foo 메소드는 localscope을 하나 추가한다.
  print()안쪽에서 a 에 대해 접근이 가능하다.
* 참고로, b는 중첩메소드가 정의되는 시점에는 아직 정의되지 않았다. 따라서 접근이 안된다.



## this

* global scope에 접근하는 키워드다.
* global scope는 기본적으로 scope에 들어가 있다. this는 이름 충돌시에 사용한다.

## me

* 실행중인 메소드다.
* RTTI 관련 메소드가 기본적으로 제공된다.
    * me.name
    * me.super(....)

* 메소드를 생성자처럼 사용하면 메소드가 생성되는 대신에 메소드호출이 된다.


## with

* with (식별자)* 블록문
* 블록문을 실행한다.
* 식별자가 있는 경우 블록문을 실행하는 동안 식별자의 object scope을 현재 this object scope보다 상위로 올린다.
    * local scope보다는 상위가 아니다.
* with 안에 with가 있을 수 있다.

## scope와 이름충돌
* 동일한 scope에 내에 같은 이름이 있으면 컴파일 에러로 판단한다.
```go
def sample
    foo(n int) void
        foo := 5 // ok
        foo aka boo // ok
        foo aka koo // ok
        foo aka foo // err. 'foo' is on same scope, local scope, already.
        with boo
            n := it++ // err. n is on local scope. duplicated.
            $n := it // err. static n var is on local scope too.
            ($b := it) aka n // err. 'n' is on local scope already.
```

## 메소드가 소유한 subnodes와 메소드 안에서 생성하는 모든 것들은 local scope이다.
* 메소드의 parameter list
* 반환값
* 메소드 실행중 생성되는 local 변수
* 메소드의 static variable
* 메소드가 기본 제공하는 Method 클래스의 메소드들<commit_msg>+ [doc] describe detail concept of scope(= frame).<commit_after># scope

## scope은 3종류로 분류한다.
* object scope 은 객체 1개에 대한 멤버들이 등록된다.
    * world에서는 가장 바깥 공간에 module 객체가 있다. module 또한 obj 이므로 전역공간이 별도로 존재하지 않는다.
* local scope 은 메소드 실행 도중에 발생하는 객체들이 등록된다.

## 모든 메소드는 실행하기 전에 넘겨받은 thisobj 로 scope을 갱신하려고 한다.

## 객체는 자신의 object scope을 교체하고 localscope을 비운다.

## interpret 과정은 origin 객체의 generation 과 bind&verify 가 별도의 phase로 구성되어 있다. 
* 따라서 객체의 메소드를 정의할때 안에 구현에서 아직 나오지 않은 다른 origin객체나 메소드를 사용하더라도 문제가 없다.
* 메소드의 localscope은 런타임에 생성되니 제외한다.

## this
* objscope에 접근하는 키워드다.
* 기본적으로 scope에 들어가 있다. this는 이름 충돌시에 사용한다.

## scope와 이름충돌
* 동일한 scope에 내에 같은 심볼이 있으면 컴파일 에러로 판단한다.
```go
def sample
    foo(n int) void
        foo := 5 // ok
        foo aka boo // ok
        foo aka koo // ok
        foo aka foo // err. 'foo' is on same scope, local scope, already.
        with boo
            n := it++ // err. n is on local scope. duplicated.
            $n := it // err. static n var is on local scope too.
            ($b := it) aka n // err. 'n' is on local scope already.
```
* func는 이름만 같을 뿐 아니라 인자리스트까지도 같아야 같은 충돌로 간주한다.
    * 반환형은 제외한다.

## with

```go
with <identifier>*
    <expr>+ 
```
* 식별자가 있는 경우 블록문을 실행하는 동안 식별자의 object scope을 현재 this object scope보다 상위로 chain에 push 한다.
    * local scope보다 상위다.
* 그리고 블록문을 실행하기 전에 새로운 localscope을 chain에 push 한다.
* 블록문을 실행한다.
* 실행이 끝나면 pop()을 2번 한다.
* with 안에 with가 있을 수 있다.

## 메소드 안에서 임시 생성하는 모든 것들은 local scope이다.
* 메소드의 parameter list
* 반환값
* 메소드 실행중 생성되는 local 변수

## node 기본적으로 sub를 접근할 수 있는 다음 API를 제공한다.
* 식별자명, 타입과 인자리스트를 모두 받는 것이 원본 API가 된다.
```go
// 정상이면 ret.val로 접근, 2개 이상 hit하면 ret.err에 hit한 sub가 모두 들어있다.
get<T=node>(name str, types Type[]) ret<ref>
get<T=node>(name str, type Type...) ret<ref>
gets(name str) ret<ref[]>
```

## sub를 찾을때 null일 인자를 넣는것과, 빈 인자리스트를 넣는 것은 다르다.
```go
get("anyName") // anyName인 객체를 찾는 것이다.
get("anyName", {}) // anyName() 를 찾는 것이다.
```
{'fraction_non_alphanumeric': 0.0975214269168404, 'fraction_numerical': 0.002779708130646282, 'mean_word_length': 2.3708040593286497, 'pattern_counts': {'":': 0, '<': 10, '<?xml version=': 0, '>': 10, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5409269', 'n_tokens_mistral': 2681, 'n_tokens_neox': 3464, 'n_words': 719}