elisp에 네임 스페이스가없는 이유는 무엇입니까?


40

Q : 네임 스페이스가없는 이유는 무엇이며 어떻게 얻을 수 있습니까?

Elisp에는 전역 네임 스페이스 이외의 네임 스페이스가 없으므로 모든 전역 함수, 변수 및 상수 앞에 고유 한 접두사를 붙이는 코딩 규칙이 생겼습니다.

성가신 요소를 제외하고는 1) 계속해서 늘어나는 훌륭한 라이브러리와 패키지, 2) 접두사 규칙을 따르지 않는 기존 함수 및 변수의 지속적인 존재 또는 그들이 사용할 수있는 좋은 접두사 옵션이 실제로는 충분하지 않습니다. 이는 주기적 시도 (의 전이와 마찬가지로 이전 코드를 합리화 것이 수단 cl으로는 cl-lib) 일이 적지 않은 양이다. (정리가 기쁘지만,을 입력 할 때마다 눈물을 흘 렸습니다 cl-find.)

elisp에 왜 수십 년 동안 사용 된 후에도 네임 스페이스가 없는지 알 수 있었지만 적당한 수확에 약간 놀랐습니다. 네임 스페이스위키 페이지 는 매우 짧습니다. Nic Ferrier 는이 문제를 약간 더 오랫동안 처리했으며 emacs-devel에도 상당히 최근의 스레드가 있습니다. 매크로를 사용하여 네임 스페이스를 구현할 수있는 가능성을 논의하는 2010 년 의 오래된 Stack Overflow 스레드가 있습니다. 매크로 접근의 다른 예는 여기 에서 찾을 수 있습니다 . 적어도 몇 가지 구현이 있습니다 ( herehere , 후자의 설명이 여기에 있음)), 그러나 그들은 몇 년 동안 많은 활동을 보지 못했으며, 나는 그것을 사용하는 라이브러리를 뛰어 넘지 않았습니다.

네임 스페이스를 쉽게 추가 할 수 있다면 이미 완료된 것으로 가정합니다. 그래서:

  • 제거 할 네임 스페이스를 추가하는 데 기술적 장벽은 무엇입니까?
  • 네임 스페이스를 추가하면 기존 코드가 많이 손상됩니까?
  • 이 기능이 유기적으로 적용되어야합니까 (인터프리터 자체로 변경) 매크로를 통해 실제로 구현 될 수 있습니까?

6
당신은 이것을 볼 수 있습니다 : github.com/Bruce-Connor/names 자동 네임 스페이스의 (이름을 분리하는 현재 수동 방법으로) 이전 버전과 호환되는 것으로 보입니다. (그리고 나는 다른 라이브러리를 보았으므로 개발자가 최근 일부 emacs 블로그에서 언급 한 네임 스페이스가있는 함수의 하위 세트를 내보낼 수는 있지만 다시 찾을 수는 없다고 확신합니다.)
T. Verron

2
두 번째로 위의 링크를 봐야합니다. 최신 (지난 달에 릴리스)이며 매우 강력한 네임 스페이스 매크로입니다. 나는 여전히 edebug와 같은 도구와의 호환성 측면에서 몇 가지 꼬임을 해결하고 있지만 패키지는 작동합니다. 귀하의 질문에 대한 답변은 정말 긴 에세이 (내가 직면 한 기술적 장벽은 많음)이지만 다음 주에 블로그 게시물에 게시하려고 노력할 것입니다.
Malabarba

1
네임 스페이스는 다른 것을 의미한다고 생각합니다. ... 변수 하나, 함수 및 매크로에 대한 또 다른 얼굴의 또 다른 및 테마, 그리고 : 내가 말한 이맥스 것 여러 네임 스페이스를 가지고
헤럴드 Hanche - 올슨

1
@ HaraldHanche-Olsen 확실히 말할 수 있습니다. 이러한 맥락에서 그는 패키지 당 네임 스페이스가없는 이유를 묻습니다.
Malabarba

답변:


28

네임 스페이스가없는 이유는 무엇입니까?

복잡하기 때문에 아직 완전히 급락 할만큼 시급한 사람은 아무도 없습니다. 이것은 dev 목록에서 (여러 번 이상) 논의되었으며 git으로 이동 한 후에이 문제를 해결하겠다는 약속이있었습니다.

그 동안, 나는 내 자신의 해결책을 썼습니다 (옵션 목록은 아래를 참조하십시오).

기술적 장벽은 무엇입니까?

바로 문 밖에 3 개의 큰 장애물이 있는데, 네임 스페이스가 현재 Emacs에서 작업 할 수 있도록하기 위해이를 극복해야합니다.

  • 심볼이 삽입되는 방식을 변경해야합니다 (이는 쉬운 부분입니다).
  • 바이트 컴파일러는 네임 스페이스를 이해해야합니다.
  • 사용되는 자동로드 생성은 package.el네임 스페이스를 이해해야합니다.

이 3 가지 작업을 패치하여 네임 스페이스를 구현하는 것은 쉬운 일이 아닙니다. 가장 최신 Emacs 버전에만 전념한다면 확실히 가능합니다. 이전 버전 (예 : 전체 24 제품군)을 지원하는 일종의 패키지를 작성하려는 경우 하나의 도전으로 바뀝니다.

그 외에도 수많은 선택적인 장애물이 있습니다. Elisp 때문에 당신과에 사용할 수있는 도구의 모든 힘 중대하다 ALL 네임 스페이스 작업에 패치 될 필요가 이들의. 가장 중요한 것은 다음과 같습니다.

  • edebug
  • 평가판
  • eval-last-sexp
  • 덮다

기존 코드를 많이 깰까요?

제대로하면 안됩니다.

이것이 유기적이어야합니까, 아니면 매크로를 통해 실제로 만들어 질 수 있습니까?

이상적으로는 유기적 일 것입니다. 개발자 목록에 나타날 때 일반적으로 논의되는 것입니다. 그러나 위에 구축되는 동안 충분히 좋게 만들 수 있습니다 .
다음은 이 목록 에서 가져온 몇 가지 예입니다 .


1
감사합니다.이 문제에 대해 매우 유익한 정보였습니다. 마지막 요점은 names솔루션입니다. 나는 유기, 내장 된 솔루션은 그리 멀지 않은 미래에오고, 또는 우리가 바로 내장을 채택하는 경우는 의심 할 이유가 있는지 궁금 솔루션이 제공했습니다.
Dan

1
@ Dan 예, 있습니다. . 즉, 이름 을 채택하지 않는 이유는 없습니다 . Emacs의 규칙과 완벽하게 호환되므로 Names를 사용하는 모든 패키지 는 언제든지 Names 사용을 자유롭게 중지 할 수 있으며 사용자는이를 알지 못합니다.
Malabarba

nameless이 목록에 정말로 추가해야 합니다. :) 훌륭한 아이디어이며 문제를 매우 깔끔하게 해결합니다.
Clément

22

마지막으로 emacs-devel에서 논의되었을 때 Lars와 같은 사람들 M-x grep이 무언가 를 할 수 있다는 것을 지적했을 때 토론이 중단되었습니다 . Elisp에 네임 스페이스를 추가하는 것은 어렵지 않지만 친숙한 모든 도구를 사용하여 올바르게 처리하는 것은 또 다른 문제입니다.


가장 많이 사용되는 공통 함수 (또는 모든 함수)의 별칭을 만들어서 쉽게 '고정'할 수 있다고 생각합니다.
Jesse

1
다른 패키지에서 변수 / 함수가 사용될 수있는 곳을 알아야하기 때문에 패키지를 개발하는 동안 "grep"의 필요성이 일반적으로 나타나므로 특정 중요한 것만이 아닌 임의의 변수 / 함수에 적용 할 수 있습니다. 이러한 이유로 별명을 몇 개 추가해도 아무런 차이가 없습니다. mit이 도움이되지 않는 또 다른 이유는 별명을 추가해도이 별명을 사용하지 않는 용도를 찾는 데 도움이되지 않기 때문입니다.
Stefan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.