
(เจ้าหญิงที่คุณชื่นชอบตอนนี้ใน Emacs!)
Elsa เป็นเครื่องมือที่วิเคราะห์รหัสของคุณโดยไม่ต้องโหลดหรือเรียกใช้ มันเป็นผลข้างเคียง 100% ฟรีและเราพยายามที่จะรักษาอย่างนั้นไว้เพื่อให้คุณสามารถวิเคราะห์รหัส ELISP ใด ๆ จากที่ใดก็ได้อย่างปลอดภัย
Elsa เพิ่มระบบประเภทที่ทรงพลังไว้ด้านบนของ EMACS LISP (ไม่จำเป็นอย่างสมบูรณ์) ในประเภทการติดตามและให้คำแนะนำที่เป็นประโยชน์เมื่อสิ่งต่าง ๆ ไม่ตรงกันก่อนที่คุณจะพยายามเรียกใช้รหัส
สารบัญ
ภาษาการเขียนโปรแกรมแบบไดนามิกเช่น Emacs Lisp, JavaScript และ Python มีข้อได้เปรียบมากมายมากกว่าภาษาที่พิมพ์แบบคงที่เช่น Java หรือ C ++ พวกเขาอนุญาตให้มีการพัฒนาและการสร้างต้นแบบได้เร็วขึ้นเนื่องจากธรรมชาติแบบไดนามิกซึ่งทำให้ง่ายต่อการเขียนและทดสอบรหัสอย่างรวดเร็ว
อย่างไรก็ตามภาษาแบบไดนามิกขาดการตรวจสอบประเภทและคุณสมบัติความปลอดภัยที่ภาษาพิมพ์แบบคงที่ สิ่งนี้สามารถนำไปสู่ข้อผิดพลาดที่ยากต่อการพัฒนาและอาจทำให้เกิดปัญหาในการผลิต ด้วยการเพิ่มระบบประเภทที่อยู่ด้านบนของภาษาแบบไดนามิกเราสามารถเพลิดเพลินไปกับประโยชน์ของทั้งภาษาแบบไดนามิกและแบบคงที่
Elsa เป็นระบบประเภทและตัววิเคราะห์สำหรับ Emacs Lisp ซึ่งมีวัตถุประสงค์เพื่อให้ประโยชน์ของระบบประเภทในขณะที่ยังคงความยืดหยุ่นและการแสดงออกของ LISP มันคล้ายกับ TypeScript สำหรับคำแนะนำประเภท JavaScript หรือ Python สำหรับ Python ซึ่งให้วิธีการเพิ่มประเภทการตรวจสอบแบบคงที่ไปยังภาษาที่พิมพ์แบบไดนามิก
Elsa พยายามที่จะเป็นสำนวนและใช้ข้อมูลที่มีอยู่ให้มากที่สุดเท่าที่จะเป็นไปได้เช่นการประกาศ Edebug, defmethod specializers หรือประเภทสล็อตคลาส EIEIO ดังนั้นปริมาณของรหัสที่ต้องมีคำอธิบายประกอบจะลดลง
ขณะนี้เราอยู่ในช่วง เบต้า API ระบบประเภทและคำอธิบายประกอบค่อนข้างคงที่ เราสนับสนุนหลายวิธีในการติดตั้งและเรียกใช้เครื่องวิเคราะห์
Elsa ไม่มีคำอธิบายประกอบประเภทจำนวนมากสำหรับฟังก์ชั่นในตัว (มีประมาณ 1,500 รายการ) และตัวแปร ผลการวิเคราะห์จึงยังคงเหมาะสมที่สุด
สิ่งต่าง ๆ อาจยังคงพังได้ทุกจุด
นี่คือรายการที่ไม่ครบถ้วนสมบูรณ์ของคุณสมบัติที่น่าสนใจยิ่งขึ้น
การเน้นข้อผิดพลาดในภาพหน้าจอมีให้โดย Elsa Flycheck Extension
ทุกสิ่งที่คุณเห็นที่นี่ใช้งานได้จริงนี่ไม่ใช่แค่การแสดง!


















downcase สามารถใช้สตริงและส่งคืนสตริงหรือใช้ int และส่งคืน int เนื่องจากเราผ่านตัวแปรสตริง s เราจึงสามารถทำให้การใช้งานของฟังก์ชั่นเกินพิกัดใดและเราสามารถรับประเภทการส่งคืนของฟังก์ชันเป็น string แทน (or string int)

หากเราผ่านอินพุตซึ่งไม่ตรงกับการโอเวอร์โหลดใด ๆ Elsa จะแสดงรายงานที่เป็นประโยชน์เกี่ยวกับสิ่งที่มีอยู่มากเกินไปและอาร์กิวเมนต์ไม่ตรงกัน

Elsa สามารถทำงานได้ด้วย Eask, Cask, MakeM.sh หรือ Emake ก่อนที่คุณจะสามารถทำการวิเคราะห์ดูส่วนการกำหนดค่าเกี่ยวกับวิธีการกำหนดค่าโครงการ
โครงการ ELSA ให้การสนับสนุนวิธีการ EASK, CASK และ LSP สำหรับการสนับสนุน makem.sh และ emake ติดต่อผู้เขียนของแพ็คเกจเหล่านั้นโดยตรง
หากคุณใช้ Eask หรือ Cask คุณสามารถใช้การรวม Flycheck และ Flymake (ดูด้านล่าง)
นอกจากนี้ ELSA ยังใช้ Protocol Server Language (LSP) และสามารถใช้กับโหมด LSP ได้ นี่เป็นตัวเลือกที่ดีที่สุดเนื่องจากสถานะทั้งหมดถูกแคชในเซิร์ฟเวอร์และการดำเนินการทั้งหมดนั้นเร็วมาก LSP ยังเปิดเผยคุณสมบัติของ ELSA มิฉะนั้นไม่สามารถใช้งานได้เช่นเสร็จสิ้น (ผ่าน lsp-completion-mode ) หรือข้อมูลประเภทโฮเวอร์ตามบริบท
ตารางต่อไปนี้สรุปตัวเลือก:
| คุณสมบัติ | ที่สุด | ถัง | makem.sh | ทำให้เกิด |
|---|---|---|---|---|
| การวิเคราะห์แบบสแตนด์อโลนจาก CLI | ||||
| การรวม Flycheck | ||||
| การรวม Flymake | ||||
| โปรโตคอลเซิร์ฟเวอร์ภาษา (LSP) |
หมายเหตุ: เมื่อคุณเรียกใช้ Elsa ในโครงการเป็นครั้งแรกขอแนะนำให้เริ่มต้นจาก CLI เพราะจะต้องรวบรวมข้อมูลการอ้างอิงทั้งหมดที่คุณใช้และบันทึกผลการวิเคราะห์ไปยังไฟล์แคช วิธีนี้อาจใช้เวลาสองสามนาทีหากคุณมีการพึ่งพาจำนวนมาก (หรือถ้าคุณรวมบางอย่างเช่น org ที่ดึงในแพ็คเกจอื่น ๆ ประมาณ 300 ชุด)
หลังจากได้ผลลัพธ์ที่แคชครั้งต่อไปที่คุณต้องการพวกเขา Elsa สามารถโหลดได้จากแคชและโดยทั่วไปจะเร็วมาก
คุณสามารถเริ่มต้น LSP ได้ทันที แต่จะไม่ตอบสนองในช่วงเวลาที่ทำการวิเคราะห์เบื้องต้น
lint )วิธีที่ง่ายที่สุดในการดำเนินการ Elsa ด้วย EASK:
eask lint elsa [PATTERNS]
[PATTERNS] เป็นทางเลือก; ค่าเริ่มต้นจะผ้าแพคเกจทั้งหมดของคุณ
exec )วิธีนี้ใช้ EASK และติดตั้ง ELSA จาก MELPA
(depends-on "elsa") ไปยังไฟล์ Eask ของโครงการของคุณeask install-depseask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] เพื่อวิเคราะห์ไฟล์exec ) ในการใช้ ELSA เวอร์ชันการพัฒนาคุณสามารถโคลนที่เก็บและใช้คุณสมบัติ eask link เพื่อใช้รหัสจากโคลน
git clone https://github.com/emacs-elsa/Elsa.git ที่ไหนสักแห่งในคอมพิวเตอร์ของคุณ(depends-on "elsa") ไปยังไฟล์ Eask ของโครงการของคุณeask link add elsa <path-to-elsa-repo>eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] เพื่อวิเคราะห์ไฟล์ วิธีนี้ใช้ถังและติดตั้ง Elsa จาก Melpa
(depends-on "elsa") ไปยังไฟล์ Cask ของโครงการของคุณcask installcask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] เพื่อวิเคราะห์ไฟล์ ในการใช้ Elsa เวอร์ชันการพัฒนาคุณสามารถโคลนที่เก็บและใช้คุณสมบัติ cask link เพื่อใช้รหัสจากโคลน
git clone https://github.com/emacs-elsa/Elsa.git ที่ไหนสักแห่งในคอมพิวเตอร์ของคุณ(depends-on "elsa") ไปยังไฟล์ Cask ของโครงการของคุณcask link elsa <path-to-elsa-repo>cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] เพื่อวิเคราะห์ไฟล์ การใช้งาน LSP ของ ELSA กำลังดำเนินการอยู่ระหว่างดำเนินการอยู่ แต่เซิร์ฟเวอร์มีเสถียรภาพเพียงพอที่จะมีประโยชน์ที่จะมี มันทำให้ผ้าสำลีเร็วมากเนื่องจากสถานะทั้งหมดถูกแคชในอินสแตนซ์ของเซิร์ฟเวอร์และเราไม่ต้องอ่านแคชทั้งหมดอีกครั้งตั้งแต่เริ่มต้น (เช่นเมื่อวิ่งผ่าน flycheck หรือ flymake)
ปัจจุบัน ELSA รองรับโหมด LSP แต่ยังไม่ได้อยู่ในโหมด LSP เพราะมัน (ELSA LSP) ไม่เสถียรเพียงพอ หากต้องการใช้ ELSA LSP ให้เรียกใช้ (elsa-lsp-register) หรือ Mx elsa-lsp-register เพื่อลงทะเบียนไคลเอนต์ด้วย lsp-mode หลังจากนั้นการใช้ Mx lsp ในบัฟเฟอร์ ELISP จะเริ่มต้นพื้นที่ทำงาน
ปัจจุบันความสามารถของ LSP เหล่านี้ได้รับการสนับสนุน
| ความสามารถ | ดำเนินการ |
|---|---|
| Hoverprovider | ให้คำอธิบายประกอบประเภทบริบทของแบบฟอร์มภายใต้จุด |
| TextDocumentsync | openclose, บันทึก |
| เสร็จสมบูรณ์ |
|
การใช้ makem.sh เพียงเรียกใช้คำสั่งนี้จากไดเรกทอรีรูทโครงการซึ่งติดตั้งและเรียกใช้ Elsa ในกล่องทรายชั่วคราว:
./makem.sh --sandbox lint-elsa
หากต้องการใช้ไดเรกทอรี Sandbox ที่ไม่ใช่แบบชั่วคราวชื่อ .sandbox และหลีกเลี่ยงการติดตั้ง ELSA ในการรันแต่ละครั้ง:
./makem.sh -s.sandbox --install-deps --install-linters./makem.sh -s.sandbox lint-elsa ดูเอกสารของ makem.sh สำหรับข้อมูลเพิ่มเติม
หากคุณติดตั้ง emake แล้วให้เรียกใช้ make lint-elsa คุณอาจต้องอัปเดตเป็นเวอร์ชันล่าสุดผ่าน EMAKE_SHA1
มิฉะนั้นติดตั้ง Emake ด้วยวิธีปกติ:
bash <( curl -fsSL https://raw.githubusercontent.com/vermiculus/emake.el/master/new ) สคริปต์นี้จะแจ้งให้คุณทราบชื่อแพ็คเกจของคุณจากนั้น bootstrap จะปรากฏขึ้น ตอนนี้คุณสามารถเรียกใช้เช็คของ Elsa ด้วย make lint-elsa
หากคุณใช้ Flycheck คุณสามารถใช้แพ็คเกจ Flycheck-Elsa ซึ่งรวม Elsa เข้ากับ Flycheck
สำหรับ Flymake คุณสามารถใช้ Flymake-Elsa
สำหรับตอนนี้ ELSA รองรับการกำหนดค่าน้อยมาก ในการ "Elsa-enable" โครงการของคุณคุณต้องเพิ่ม Elsafile.el ลงในรากของโครงการของคุณ
Elsa มีแนวคิดเกี่ยวกับส่วนขยายและกฎเกณฑ์ซึ่งปัจจุบันมีอยู่ภายในส่วนใหญ่และถูกห่อหุ้มด้วยกฎ "ค่าเริ่มต้น" และส่วนขยายขนาดใหญ่ ระบบนี้ยังคงทำงานอยู่
ต่อไปนี้เป็นวิธีที่คุณสามารถขยาย Elsa ได้ในวันนี้
วิธีหนึ่งในการขยาย ELSA คือการให้กฎการวิเคราะห์พิเศษสำหรับรูปแบบและฟังก์ชั่นเพิ่มเติมที่เราสามารถใช้ประโยชน์จากความรู้เกี่ยวกับวิธีการทำงานของฟังก์ชั่นเพื่อ จำกัด การวิเคราะห์ให้แคบลงมากขึ้น
ตัวอย่างเช่นเราสามารถพูดได้ว่าหากอินพุตของ not เป็น t ค่าส่งคืนจะ nil อยู่เสมอ สิ่งนี้เข้ารหัสความรู้โดเมนของเราในรูปแบบของกฎการวิเคราะห์
กฎทั้งหมดจะถูกเพิ่มในรูปแบบของส่วนขยาย Elsa มีส่วนขยายหลักไม่กี่ส่วนสำหรับฟังก์ชั่นในตัวที่พบบ่อยที่สุดเช่นการจัดการรายการ ( car , nth ... ), predicates ( stringp , atomp ... ), ฟังก์ชั่นเชิงตรรกะ ( not , ... ) และอื่น ๆ สิ่งเหล่านี้จะถูกโหลดโดยอัตโนมัติเนื่องจากฟังก์ชั่นเป็นเรื่องธรรมดาแทบทุกโครงการจะใช้มัน
มีการขยายเพิ่มเติมสำหรับแพ็คเกจภายนอกที่เป็นที่นิยมเช่น dash.el หากต้องการใช้ให้เพิ่มลงใน Elsafile.el ของแบบฟอร์ม register-extensions เช่นนั้น
(register-extensions
dash
; ; more extensions here
) ส่วนขยายจะถูกโหลดอัตโนมัติเมื่อ ELSA มาตามแบบฟอร์มที่ต้องการ สำหรับ (require 'foo) มันจะมองหา elsa-extension-foo.el และพยายามโหลด ซึ่งหมายความว่าในทางปฏิบัติคุณจะไม่ต้องลงทะเบียนส่วนขยายสำหรับแพ็คเกจบุคคลที่สามส่วนใหญ่
หลังจากการวิเคราะห์แบบฟอร์มเสร็จแล้วเรามีข้อมูลประเภททั้งหมดและ AST พร้อมที่จะดำเนินการเพิ่มเติมโดยการตรวจสอบและกฎต่างๆ
สิ่งเหล่านี้สามารถ (รายการที่ไม่ครบถ้วน):
lisp-case สำหรับการตั้งชื่อแทน snake_caseif มี progn ที่ไร้ประโยชน์if ไม่ได้ประเมินไป non-nil เสมอ (ซึ่งในกรณีนี้รูปแบบ if นั้นไร้ประโยชน์)ELSA ให้กฎในตัวและสามารถใช้งานได้อีกมากมายโดยการโหลดส่วนขยาย
หากต้องการลงทะเบียนชุดกฎให้เพิ่มแบบฟอร์มต่อไปนี้ใน Elsafile.el
(register-ruleset
dead-code
style
; ; more rulesets here
)ในผู้ใช้ ELISP ไม่จำเป็นต้องให้คำอธิบายประกอบประเภทกับรหัสของพวกเขา ในขณะที่หลายสถานที่สามารถอนุมานได้มีสถานที่โดยเฉพาะอย่างยิ่งในฟังก์ชั่นที่ผู้ใช้กำหนดซึ่งเราไม่สามารถคาดเดาประเภทที่ถูกต้อง (เราสามารถอนุมานสิ่งที่เราเห็นในระหว่างการรันไทม์)
อ่านเอกสารคำอธิบายประกอบประเภทสำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเขียนประเภทของคุณเอง
เปิดปัญหาหากคุณต้องการทำงานกับบางสิ่ง (ไม่จำเป็นต้องระบุไว้ด้านล่างในแผนงาน) ดังนั้นเราจะไม่ทำซ้ำงาน หรือเพียงแค่ให้ข้อเสนอแนะหรือเคล็ดลับที่เป็นประโยชน์
คุณสามารถให้คำจำกัดความประเภทสำหรับฟังก์ชั่นในตัวโดยขยาย elsa-typed-builtin.el มีมากมายให้ไป บางประเภทที่จำเป็นในการแสดงสิ่งที่เราต้องการอาจยังไม่มีอยู่หรือได้รับการสนับสนุนเปิดปัญหาเพื่อให้เราสามารถหารือเกี่ยวกับวิธีการจำลองสิ่งต่าง ๆ
ดูการสนทนา
หลังจากการโทร (require 'elsa-font-lock) มีฟังก์ชั่น elsa-setup-font-lock ซึ่งสามารถเรียกได้จาก emacs-lisp-mode-hook เพื่อตั้งค่าการล็อคแบบอักษรเพิ่มเติมสำหรับประเภท ELSA
แรงบันดาลใจที่ยิ่งใหญ่ที่สุดคือโครงการ PHPSTAN ซึ่งเป็นแรงผลักดันเริ่มต้นให้ฉันเริ่มโครงการนี้ ฉันผ่านแหล่งข้อมูลของพวกเขาหลายครั้งเพื่อค้นหาแรงบันดาลใจและเลือกคุณสมบัติ
แรงบันดาลใจที่สองคือ TypeScript ซึ่งเปลี่ยนภาษาที่ไม่น่าสนใจให้กลายเป็นโรงไฟฟ้าของเว็บ (ไม่เพียง)
ฉันยืมอย่างหนักจากทั้งสองโครงการนี้และขยายความกตัญญูและความชื่นชม