`สัญลักษณ์ - ค่า 'ทำอะไร


13

เอกสารทำให้ฉันไม่ฉลาด:

ฟังก์ชันนี้คืนค่าที่เก็บไว้ในเซลล์ค่าของสัญลักษณ์ นี่คือที่เก็บค่าปัจจุบัน (ไดนามิก) ของตัวแปร หากตัวแปรไม่มีการเชื่อมต่อโลคัลนี่เป็นเพียงค่าโกลบอล หากตัวแปรเป็นโมฆะข้อผิดพลาดเป็นโมฆะตัวแปรจะถูกส่งสัญญาณ

จุดของค่าสัญลักษณ์คืออะไร? ฉันจะต้องใช้ที่ไหนและเมื่อไหร่?


3
ขอบคุณที่พยายามหาคำตอบโดยถาม Emacs นั่นคือวิธีการที่ถูกต้อง: ถาม Emacs ก่อนแล้วถามที่นี่เกี่ยวกับสิ่งที่ยังไม่ชัดเจนแจ้งให้เราทราบในคำถามของคุณว่าคุณได้ลองอะไรไปแล้ว รุ่งโรจน์!
Drew

คำตอบ:


13

คุณต้องการเมื่อในรหัส Elisp คุณต้องการรับค่าของสัญลักษณ์นั่นคือค่าของมันเมื่อพิจารณาว่าเป็นตัวแปร

โปรดทราบว่าสัญลักษณ์ Elisp มีลักษณะ / คุณสมบัติหลายประการ:

  • มันมีชื่อ (ฟังก์ชั่นที่symbol-nameให้)
  • มันอาจมีค่าเมื่อพิจารณาว่าเป็นตัวแปร (ซึ่งsymbol-valueให้)
  • มันอาจตั้งชื่อฟังก์ชั่นเมื่อพิจารณาว่าเป็นฟังก์ชั่น (ซึ่งsymbol-functionให้)
  • มันมีรายการทรัพย์สิน (ซึ่งsymbol-plistให้)

คิดว่าสัญลักษณ์เป็นวัตถุที่มีคุณลักษณะต่าง ๆ


1
โปรดทราบว่า (ตามที่ระบุในเอกสาร) symbol-valueจะส่งคืนการเชื่อมโยงไดนามิกสำหรับสัญลักษณ์เสมอ คุณไม่สามารถรับค่าศัพท์ด้วยวิธีนี้
phils

2
ดูC-h i g (elisp) Symbol Components RETเอกสารประกอบเกี่ยวกับเซลล์ / ส่วนประกอบสัญลักษณ์ต่าง ๆ เหล่านี้
phils

@phils: (setq lexical-binding t) (let ((v 42)) (message "lex: %S, val: %S" lexical-binding (symbol-value 'v)))หืมมมผมสงสัยว่า: แต่ใช่ว่าเป็นสิ่งที่มันบอกว่าที่ (Elisp) Lexical Binding: " ฟังก์ชั่นชอบsymbol-value, boundp'และset'เพียงดึงหรือปรับเปลี่ยนแบบไดนามิกของตัวแปรที่มีผลผูกพัน (เช่นเนื้อหาของเซลล์ค่าสัญลักษณ์ของ) " Symbol Componentsแต่ไม่มีอะไรจะพูดเกี่ยวกับมันที่
Drew

10

(Doh, @Drew ใส่บางส่วนของการติดตามต่อไปอย่างไรก็ตามนี่คือรายละเอียดเพิ่มเติมบางส่วน)

เมื่อหน้าคู่มือเกี่ยวกับส่วนประกอบสัญลักษณ์อธิบายว่ามีสี่องค์ประกอบ (เซลล์) สำหรับแต่ละสัญลักษณ์: เซลล์ชื่อพิมพ์, เซลล์มูลค่า, การกำหนดฟังก์ชันและรายการคุณสมบัติ เซลล์ค่าหรือเซลล์ฟังก์ชันอาจเป็นโมฆะและรายการคุณสมบัติอาจเป็นศูนย์

ในขณะที่คู่มือชี้ให้เห็น:

เนื่องจากแต่ละสัญลักษณ์มีค่าและเซลล์ฟังก์ชันแยกกันชื่อตัวแปรและชื่อฟังก์ชันจึงไม่ขัดแย้งกัน

นั่นเป็นเหตุผลที่คุณสามารถมีตัวอย่างเช่น:

(setq test "kittens")
(defun test ()
  (message "puppies"))
(symbol-value 'test)    ; => "kittens"
(symbol-function 'test) ; => (lambda nil (message "puppies"))

1
อาว่ามันมีค่าเมื่อเทียบกับฟังก์ชั่นทำให้ง่ายต่อการเข้าใจ ขอบคุณ
Cat Unfun

8

นี่คือข้อมูลอ้างอิงทางประวัติศาสตร์เล็กน้อย (ฉันยังไม่ได้เกิดมาเมื่อเกิดเหตุการณ์ที่อธิบายไว้ดังนั้นอาจมีบางคนที่มีความรู้มากกว่านี้จะแก้ไขฉันได้ทั้งหมดนี้มาจากการอ่านบทความเก่าและหนังสือบางเล่ม)

ดูเหมือนจะย้อนกลับไปในยุคของ Fortran vs Lisp "symbolic" ซึ่งเป็นคำที่มีลักษณะคล้ายคำว่า "object oriented" ในทุกวันนี้ โดยทั่วไปแล้วโปรแกรม Ie นั้นถูกมองว่าเป็นเพียงสูตรทางคณิตศาสตร์ขนาดใหญ่ซึ่งในที่สุดจะมีการเสียบตัวเลขและตัวยึดสำหรับตัวเลขนั้นไม่มีความสำคัญ ข้อมูลสัญลักษณ์ทั้งหมดที่มีอยู่ในโปรแกรมจะหายไปทันทีที่โปรแกรมนั้นถูกเรียกใช้รวบรวมหรือตีความ ความแปลกใหม่ของ Lisp คือมันอนุญาตให้ใช้สัญลักษณ์เพื่อคงอยู่ในโปรแกรมแม้ว่าจะรันรวบรวมหรือตีความ สิ่งนี้เป็นแรงบันดาลใจของคำศัพท์เช่น "พีชคณิตสัญลักษณ์" (ในการจัดการกับสูตรพีชคณิตเหมือนกับที่ทำบนกระดาษ / กระดานดำแทนที่จะคำนวณโดยตรง) เพื่อที่จะสนับสนุนสัญลักษณ์นี้ (และสิ่งที่เป็นสัญลักษณ์อื่น ๆ ) จะต้องมีชื่อและคุณสมบัติบางอย่าง จากมุมมองที่ไม่ใช่สัญลักษณ์เราอาจพูดว่า "สัญลักษณ์เป็นเพียงแค่ชื่อพอยน์เตอร์" และในขณะที่สิ่งนี้ไม่เป็นความจริงหากมีสิ่งใดที่เป็นตัวชี้ไปยัง structs แต่สำหรับวัตถุประสงค์เชิงปฏิบัติสัญลักษณ์เป็นผู้ออกแบบด้านซ้าย ด้านมือของคู่ค่าตัวแปร สิ่งนี้ยังทำให้มองเห็นได้symbol-value ฟังก์ชั่นเป็น dereferencing ตัวชี้ในภาษาที่ไม่ใช่สัญลักษณ์

Lisps สมัยใหม่แตกต่างกันไปตามจำนวนที่สามารถเชื่อมโยงกับหนึ่งสัญลักษณ์ (สมมติว่าคุณมีภาษาที่ไม่ใช่สัญลักษณ์ที่มีหลายหน่วยความจำกอง / กอง, คุณสามารถจินตนาการสถานการณ์ที่ตัวชี้เดียวกันมีความหมายเมื่อตีความในบริบทของกองที่แตกต่างกัน / กอง) ดังนั้นภาษา Lisp2 (Emacs Lisp เป็นหนึ่งในภาษาดังกล่าว) มีที่เก็บข้อมูลแยกต่างหากสำหรับฟังก์ชั่นและตัวแปรนี่คือสาเหตุที่มีเช่นsymbol-functionกันซึ่ง "dereferences ตัวชี้ที่ชี้ไปยังที่เก็บข้อมูลฟังก์ชัน" Scheme ไม่มีที่เก็บข้อมูลพิเศษนี้และ Clojure AFAIK ไม่มีทั้งที่และsymbol-plistไม่มี


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.