(. 123)의 기간 의미


12

. /path/to/filebash에서 배운 것은 파일을 실행하는 데 사용됩니다. 호기심으로 이맥스에서 다음과 같은 것을 평가합니다.

(. 123)
     ⇒ 123

(read "(. 123)")
     ⇒ 123

Emacs는 단순히 다음과 같이 읽은 (. 123)것처럼 보입니다 123.


.기능이 아닙니다. .변수가 아닙니다. 아무 일도 일어나지 않았습니다-zip, zero, zilch, nada.
lawlist

@lawlist 그것보다 조금 더 복잡한 것 같습니다. 예를 들어 qsdf함수도 아니지만 (qsdf 123)수율 void function...입니다. 그리고 (. 123 456)구문 오류가 발생 ". in wrong context"합니다.
T. Verron

1
나에게 독자의 가장자리 케이스처럼 보인다 ...
wasamasa

1
Btw, elisp 의 bash .(또는 source) 와 동등한 것입니다 load.
T. Verron

(. 123)tutorialspoint.com/execute_lisp_online.php 제공합니다 *** - READ from #<INPUT BUFFERED FILE-STREAM CHARACTER #P"main.lisp" @1>: token "." not allowed here. 이맥스에서 : (boundp '.)nil(fboundp '.)nil. 즉, 당신이 묘사 한 효과는 매우 이상합니다!
Tobias

답변:


15

Emacs가 단순히 123으로 (. 123)을 읽는 것처럼 보입니다.

정확히 일어난 일입니다. 소스로 백업하려면 다음을 수행하십시오.

if (ch == '.')
  {
    if (!NILP (tail))
      XSETCDR (tail, read0 (readcharfun));
    else
      val = read0 (readcharfun);
    read1 (readcharfun, &ch, 0);

    if (ch == ')')
      {
        if (doc_reference == 1)
          return make_number (0);
        if (doc_reference == 2 && INTEGERP (XCDR (val)))
          /* ... */
        return val;
      }
    invalid_syntax (". in wrong context");
  }

이의 특별한 경우이다 read_list에서 lread.c. 일반적으로 a . 는 이전에 읽은 꼬리의 cdr을 다음과 같이 설정하여 처리됩니다. 그러나 꼬리가없는 경우 (예 :를 읽을 때 (. 123)) 다음 항목을 그대로 읽은 다음 반환합니다. 개인적으로, 나는 잘못된 구문 오류로 이어질 것으로 기대하지만, 누군가가 특별한 끔찍한 소스를 해결하기 위해 특별한 사례를 넣을 것이라고 확신합니다. 다른 리스프 인터프리터는 재미와 아무도를 위해 어떻게 행동하는지 나는 밖으로 시도했다 csi, pil그리고 sbcl이 글을 읽는 허가를 할 그것을 가치가 버그를보고 할 수 있도록.

편집 : Guile은 동일하게 작동하지만 MIT-Scheme은 그렇지 않습니다. 이 행동이 GNU에 관한 것이라는 이론이 있습니다 ...


Guile GNU도 아닌가요?
T. Verron

예,하지만 요즘 MIT-Scheme도 마찬가지입니다.
wasamasa

3
Emacs 버그보고를 고려하십시오. 이것은 "정상적인"Lisp 동작이 아닙니다. 또한 문서화되지 않은 동작 인 것 같습니다.
Drew

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.