Common Lisp용 코드 포맷기
18438 단어 Common Lisptech
Code formatter for Common Lisp
Meta note.
독자 대상
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
테스트됨
주의
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)
Reference
이 문제에 관하여(Common Lisp용 코드 포맷기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hyotang666/articles/9815dfa75f21e5f5ffaf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)