이 코드를 시도해봤는데 스코프에 존재하지 않는 참조라고 안되더라 ㅇㅅㅇ. 람다를 할당하기 이전에 정의부터 하기 때문에 그런건가? 그럼 다른 언어도 람다의 자가 참조는 못함?
하스켈은 됩니다
러스트만큼 패키지 관리가 쉽고 간단함 ㅇㅇ?
에?? 하스켈 쓰시려고요? 쓰지 마세요.
그런데 closure에요;;
clojure 언어 이름이 클로저 아니었음 ㅇㅅㅇ?
clojure란 이름이 closure에 java섞어서 지은 이름일껄
c# + lisp + java = clj
저러면 자기참조 구조체돼서 객체 주소바뀌면 터짐
값복사는 재귀구조체되니까 못하고 참조로 가질수밖에 없는데 그 참조 주소가 closure 변수가 있는 스택 주소야 그리고 closure가 이동해도 그 주소는 그대로니 어디 이동시키고 호출하면 펑펑 ㅇㅇ
해결하려면 stable한 주소를 들고있어야되는데 지금 클로저론 못하고 편법좀 동원해야함
하스켈같은 언어들이 이런거 신경쓸일없는건 죄다 gc에 올려서 그런거고
저기서 closure 라이프 타임을 static으로 만들면 되지 않나
스택에 뭐가 들어가는거임? 함수 포인터 말고 더 필요한게 있나..?
캡쳐된 환경변수가 들어있죠 static으로 만들려면 힙할당하거나 값복사해야하는데 전자는 러스트에선 안하고 후자는 불가능함
ㅇㅇ 캡쳐하면 당연히 들어가는데 저 위의 예제에서는 캡쳐하는게 closure자체 밖에 없고 closure가 static이 되면 저장할 필요가 없잖아. 물론 그러면 걍 함수로 빼도 되니까 의미 없긴 한데
그러니까 static으로 못만든다고 환경변수 캡쳐 하나도 안하면 재귀함수마냥 가능하겠지만 그건 극히 일부의 케이스
참고로 closure의 클로저 안에서 closure를 참조하는건 소유권상 굉장히 힘든데 클로저안에서 재귀하는거 자체는 가능성있음 become같은 키워드가 생기니 마니 하고있기도 하고 ㅇㅇ
하스켈은 됩니다
러스트만큼 패키지 관리가 쉽고 간단함 ㅇㅇ?
에?? 하스켈 쓰시려고요? 쓰지 마세요.
그런데 closure에요;;
clojure 언어 이름이 클로저 아니었음 ㅇㅅㅇ?
clojure란 이름이 closure에 java섞어서 지은 이름일껄
c# + lisp + java = clj
저러면 자기참조 구조체돼서 객체 주소바뀌면 터짐
값복사는 재귀구조체되니까 못하고 참조로 가질수밖에 없는데 그 참조 주소가 closure 변수가 있는 스택 주소야 그리고 closure가 이동해도 그 주소는 그대로니 어디 이동시키고 호출하면 펑펑 ㅇㅇ
해결하려면 stable한 주소를 들고있어야되는데 지금 클로저론 못하고 편법좀 동원해야함
하스켈같은 언어들이 이런거 신경쓸일없는건 죄다 gc에 올려서 그런거고
저기서 closure 라이프 타임을 static으로 만들면 되지 않나
스택에 뭐가 들어가는거임? 함수 포인터 말고 더 필요한게 있나..?
캡쳐된 환경변수가 들어있죠 static으로 만들려면 힙할당하거나 값복사해야하는데 전자는 러스트에선 안하고 후자는 불가능함
ㅇㅇ 캡쳐하면 당연히 들어가는데 저 위의 예제에서는 캡쳐하는게 closure자체 밖에 없고 closure가 static이 되면 저장할 필요가 없잖아. 물론 그러면 걍 함수로 빼도 되니까 의미 없긴 한데
그러니까 static으로 못만든다고 환경변수 캡쳐 하나도 안하면 재귀함수마냥 가능하겠지만 그건 극히 일부의 케이스
참고로 closure의 클로저 안에서 closure를 참조하는건 소유권상 굉장히 힘든데 클로저안에서 재귀하는거 자체는 가능성있음 become같은 키워드가 생기니 마니 하고있기도 하고 ㅇㅇ