ฟังก์ชั่น
ฟังก์ชันเป็นแนวคิดหลักใน Scheme ซึ่งมอบวิธีการในการสรุปตรรกะ เปิดใช้งานการใช้โค้ดซ้ำ และจัดโครงสร้างสคริปต์ของคุณอย่างมีประสิทธิภาพ ด้วยฟังก์ชันต่างๆ คุณสามารถสร้างสคริปต์แบบโมดูลาร์ที่สามารถบำรุงรักษาได้ซึ่งจัดการงานได้หลากหลาย ตั้งแต่การทำงานขั้นพื้นฐานไปจนถึงเวิร์กโฟลว์ขั้นสูงใน Lumi
ส่วนนี้ทำหน้าที่เป็นการแนะนำฟังก์ชันต่างๆ ใน Scheme และวางรากฐานสำหรับการทำความเข้าใจประเภท คำจำกัดความ และการใช้งาน ส่วนต่อๆ ไปจะเจาะลึกลงไปถึงประเภทฟังก์ชันเฉพาะและความสามารถเฉพาะตัว
ไวยากรณ์และนิพจน์ขั้นต่ำ
รหัสโครงการทำจาก นิพจน์ นิพจน์ประเมินเป็นค่า ไวยากรณ์เป็นแบบเดียวกัน: วงเล็บจะสร้างการโทร โดยให้ชื่อโอเปอเรเตอร์หรือฟังก์ชันอยู่ก่อน
(+ 1 2) ; Adds 1 and 2, resulting in 3
(if #t 1 0) ; Evaluates to 1 because the condition is true
(list 1 2 3) ; Creates a list: (1 2 3)เนื่องจากทุกสิ่งคือการแสดงออก โฟลว์การควบคุมจึงเข้ากับสไตล์เดียวกันกับการเรียกใช้ฟังก์ชันได้อย่างเป็นธรรมชาติ
ทำไมฟังก์ชั่นถึงมีความสำคัญ
ฟังก์ชันมีบทบาทสำคัญใน Scheme ด้วยเหตุผลหลายประการ:
- การนำโค้ดกลับมาใช้ใหม่ได้: หลีกเลี่ยงการทำซ้ำโดยห่อหุ้มตรรกะให้เป็นส่วนประกอบที่นำมาใช้ซ้ำได้
- ความเป็นโมดูล: แบ่งงานที่ซับซ้อนออกเป็นส่วนย่อยๆ ที่สามารถจัดการได้
- พฤติกรรมแบบไดนามิก: ยอมรับพารามิเตอร์เพื่อจัดการอินพุตต่างๆ หรือปรับให้เข้ากับสถานการณ์ที่แตกต่างกัน
- นามธรรมที่สูงขึ้น: ลดความซับซ้อนของตรรกะโดยเน้นไปที่ฟังก์ชัน “อะไร” ทำหน้าที่มากกว่า “อย่างไร” ของฟังก์ชัน
ภาพรวมของประเภทฟังก์ชัน
Scheme มีโครงสร้างฟังก์ชันที่หลากหลาย ซึ่งแต่ละโครงสร้างเหมาะกับกรณีการใช้งานเฉพาะ:
ฟังก์ชันที่มีชื่อ เหล่านี้เป็นฟังก์ชันมาตรฐานที่กำหนดด้วย
defineพวกมันเป็นแกนหลักของสคริปต์ส่วนใหญ่(define (square x) (* x x))ฟังก์ชันที่ไม่ระบุชื่อ มีชื่อเรียกอีกอย่างว่า ฟังก์ชัน lambda ซึ่งเป็นฟังก์ชันที่ไม่มีชื่อซึ่งกำหนดไว้ในบรรทัดสำหรับการใช้งานครั้งเดียว
(lambda (x) (* x x))ฟังก์ชันลำดับที่สูงกว่า ฟังก์ชันที่รับฟังก์ชันอื่นเป็นอาร์กิวเมนต์หรือส่งคืนฟังก์ชันเป็นผลลัพธ์ ช่วยให้สามารถใช้งานนามธรรมอันทรงพลัง เช่น การทำแผนที่ การกรอง และการลดขนาด
(map (lambda (x) (* x x)) '(1 2 3 4)) ; Returns (1 4 9 16)
ไวยากรณ์ทั่วไปสำหรับฟังก์ชัน
ฟังก์ชันใน Scheme มีไวยากรณ์ที่เรียบง่ายและสอดคล้องกัน:
(define (function-name parameter1 parameter2 ...)
body-expression)function-name: ชื่อของฟังก์ชันparameter1, parameter2, ...: อาร์กิวเมนต์ที่ฟังก์ชันใช้body-expression: ตรรกะที่ดำเนินการเมื่อมีการเรียกใช้ฟังก์ชัน
ตัวอย่าง:
(define (add x y)
(+ x y))
(add 3 5) ; Returns 8ผลข้างเคียงและสถานะระดับโลก
ใน Lumi กระบวนการที่มีประโยชน์มากมายมีผลข้างเคียง: ปรับเปลี่ยนรูปภาพ เปลี่ยนรูปวาด เขียนไฟล์ หรือแสดงผลเอาต์พุต
- แยกผลข้างเคียงออกเป็นขั้นตอนเล็กๆ ที่มีชื่อชัดเจน
- หลีกเลี่ยงการเปลี่ยนบริบททั่วโลก เว้นแต่ในกรณีที่จำเป็น
- เมื่อคุณเปลี่ยนบริบท (สี แปรง ฯลฯ) ให้ล้อมงานด้วย
lumi-context-pushและlumi-context-popเพื่อให้สถานะของผู้ใช้กลับคืนมา