Common Lisp용 코드 포맷기

18438 단어 Common Lisptech

Code formatter for Common Lisp


Meta note.


독자 대상

  • Common Lisp의 코드 포맷기를 찾는 사람.
  • Introdunction.


    Common Lisp용 코드 포맷기를 제작했습니다.
    자작 라이브러리를Quicklisp에 등록하려면, '당신의 인코딩 형식은 지역 사회에서 일반적인 형식이 아닙니다. 그 수정 후에 다시 시작합니다.' (초의역) 가 겉치레로 지불됩니다.
    한 사람이 외롭게 쓰면 이상한 습관을 들일 수 없다.
    수동으로 고친 것은 뼈이기 때문에 일단 정체를 만들면 된다.
    README 를 먼저 번역합니다.

    TRIVIAL-FORMATTER 9.0.0


    이거 뭐야?


    Common Lisp용 코드 포맷기
    참조trivial formatter 소스 코드.
    이 파일은 trivial formatter 자체로 포맷됩니다.

    사용법


    (trivial-formatter:fmt :your-system :supersede)
    
    자세한 내용은 spec 파일를 참조하십시오.

    선가중치.


    기본값은 구현에 따라 달라집니다.
    (아마 80일 것이다.)
    일반적인 Lisp Prity 인쇄 시스템을 사용하는 방법*PRINT-RIGHT-MARGIN*으로 제어할 수 있습니다.
    (let ((*print-right-margin* 100)) ; <--- 線幅を100で指定。
      (trivial-formatter:fmt :your-system :supersede))
    

    엄격한 패턴.


    디버거를 호출하면 일부 설치 (ecl 등) 는cl-user 포장에 들어갑니다.
    이런 상황에서 loop宏의 후추적 형식은 추하게 변할 수 있다.
    (LOOP YOUR-PROJECT::FOR YOUR-PROJECT::I YOUR-PROJECT::UPFROM 0 ...)
    
    키 기호를 순환 매크로 키로 사용하면 이런 추악한 형식을 피할 수 있다.
    (LOOP :FOR YOUR-PROJECT::I :UPFROM 0 ...)
    
    strict 모드에서 trivial formatter는 순환 매크로 키워드를 키워드 기호로 포맷합니다.
    이 옵션을 사용하려면 *strict-loop-keyword-p*t에 바인딩합니다.
    * (let ((trivial-formatter:*strict-loop-keyword-p* t))
        (trivial-formatter:fmt :your-system :supersede))
    

    개발자


    Reader


    만약 원본 코드에 특수한 읽기 매크로가 있다면 trivial foramtter는 알 수 없는 읽기 매크로 오류를 알립니다.
    이런 상황에서 trivial-formatter는readtable, 특히NAMED-READTABLES에 매우 의존하기 때문에 일반적인Lisp 방법으로 리더를 확장할 수 있다.
    이 기능을 확장하려면 읽기 매크로 함수에서 중간 대상을 되돌려야 합니다.
    (let ((*readtable* (named-readtables:copy-named-readtable 'as-code)))
      (set-macro-character #\! (lambda (stream char) `(,char ,(read stream))))
      (read-as-code))
    !hoge
    => (#\! HOGE)
    
    상세 내용clhs
    그리고named-readtables.

    프린터


    중간 객체를 작성할 때는 미리 설정된 인쇄 함수를 작성해야 합니다.
    Trivial-formatter는 인쇄 시스템에 크게 의존하기 때문에 일반적인Lisp 방법으로 확장할 수 있다.
    (defun !-printer (stream exp)
      (format stream "~<~A~S~:>" exp))
    (set-pprint-dispatch '(cons (eql #\!) (cons * null)) '!-printer)
    (print-as-code '(#\! hoge))
    => !hoge
    
    자세한 내용은 clhs를 참조하십시오.

    외부 포맷기를 불러옵니다.


    외부 포맷기를 로드할 수 있습니다.
    확장 코드를 외부 형식으로 쓸 수 있습니다.
    외부 형식 파일은 "formatters.lisp"의 이름을 붙여야 합니다.
    trivial formatter가 *foreign-formatters-directories*에서 파일을 읽어들입니다.
    기본값은quicklip의local-project 디렉터리와roswell의local-project 디렉터리입니다.

    포장trivial formatter.


    trivial-formatter-user에서deformatter, pprint-fun-call, pprint-linear-elt를 일반적인lisp 기호와 함께 사용할 수 있습니다.

    PPRINT-FUN-CALL


    pprint-fun-call은 키와 값을 고려합니다.
    (pprint-fun-call nil '(asdf:component-pathname component :direction :output :if-does-not-exist :create :if-exists if-exists))
    (ASDF:COMPONENT-PATHNAME COMPONENT
                             :DIRECTION :OUTPUT
                             :IF-DOES-NOT-EXIST :CREATE
                             :IF-EXISTS IF-EXISTS))
    NIL
    

    PPRINT-LINEAR-ELT

    pprint-linear-elt 현재 들여쓰기를 설정하고 모든 cdr 요소에서 줄을 바꿉니다.
    (pprint-linear-elt nil '(asdf:component-pathname component :direction :output :if-does-not-exist :create :if-exists if-exists))
    (ASDF:COMPONENT-PATHNAME COMPONENT
                             :DIRECTION
                             :OUTPUT
                             :IF-DOES-NOT-EXIST
                             :CREATE
                             :IF-EXISTS
                             IF-EXISTS))
    NIL
    

    DEFORMATTER


    deformatter는 가방의 존재와 기호의 충돌, set-pprit-dispatch를 주의합니다.
    (macroexpand-1 '(deformatter package symbol (stream exp)
                      (format stream "~A" exp)))
    
    (WHEN (FIND-PACKAGE "PACKAGE")
      (DEFUN #:PPRINT-SYMBOL3440 (STREAM EXP) (FORMAT STREAM "~A" EXP))
      (SET-PPRINT-DISPATCH
       `(CONS (MEMBER ,(UIOP/PACKAGE:FIND-SYMBOL* "SYMBOL" "PACKAGE")))
       '#:PPRINT-SYMBOL3440)
      '#:PPRINT-SYMBOL3440)
    

    TRIVIAL-FORMATTER-USER:SET-PPRINT-DISPATCH


    인쇄 기능을 일시적으로 설정하려면 *print-pprint-dispatch*를 바인딩하고 cl:set-pprint-dispatch 대신 trivial-formatter-user:set-pprint-dispatch를 사용하십시오.그렇지 않으면 임시 기능은 절대 작용하지 않는다.cl:set-pprint-dispatch는 포장:trivial-formatter-user으로 음영을 줍니다.
    (deformatter sxql where (stream exp)
      (let ((*print-pprint-dispatch* (copy-pprint-dispatch)))
        (set-pprint-dispatch '(cons (member :and :or)) 'pprint-linear-elt)
        (pprint-fun-call stream exp)))
    

    제품 목표


    라이선스


    mit

    개발하다


    sbcl/2.0.9

    테스트됨

  • sbcl/2.0.9
  • ccl/1.12 ; ccl이 ansi 표준을 위반했기 때문에 실패했습니다.
  • ecl/20.4.24
  • 주의


    trivial-formatter는 적어도 상기 처리 시스템에서 이식할 수 있다.
    그러나 이것은 결코 그것이 같은 기능을 가지고 있다는 것을 의미하지 않는다.
    예를 들어, "if"형식이 다릅니다.
    원소가 비교적 짧아도 sbcl는 줄 바꾸기를 출력하지만 다른 처리 시스템에서는 그렇지 않을 수도 있습니다.
    #+sbcl
    (if a
        b
        c)
    
    #+(or ecl ccl)
    (if a b c)
    

    이미 알고 있는 문제.


    clisp


    clisp가 지원되지 않습니다.
    clipp의 발언
    The Lisp Pretty Printer implementation is not perfect yet.

    ccl


    현재 ansi 표준을 위반하여ccl의 지원을 잠시 중지하였습니다.
    ? (pprint-dispatch t nil)
    => error
    
    clhs 기준
    table---a pprint dispatch table, or nil.
    다행히도 이 문제는 이미 수정되었다.
    다음ccl이 발표될 때까지 기다리거나 원본에서 현재ccl을 만듭니다.

    Reader。


    리더십이 충돌할 때, 이런 리더십은 무시될 것이다.
    새 리더 매크로를 추가할 수 있지만 기존 리더 매크로는 수정할 수 없습니다.

    형식 제어


    trivial formatter는 newline 형식 컨트롤의 들여쓰기를 조정할 수 없습니다.

    설치하다.


    trivial formatterroswell를 설치하는 것이 좋습니다.
    $ ros install hyotang666/trivial-formatter
    
    실행 중인lisp 환경에trivial formatter를 불러오려면 repl에서 다음과 같은 내용을 평가하십시오.
    * (ql:quickload :trivial-formatter)
    

    좋은 웹페이지 즐겨찾기