บทนำ (Overview)
ภาษา Lisp สามารถสร้างตัวแปร (Variable) ได้เช่นเดียวกับภาษาอื่น ๆ โดยมีฟังก์ชันสำคัญ “setq” และ “set” โดยตัวแปรก็เหมือนกับที่ๆ เก็บข้อมูลในหน่วยความจำ และสามารถเรียกใช้เมื่อไหร่ก็ได้จนกว่าค่าจะเปลี่ยนหรือโดนลบไปดังต่อไปนี้
ขั้นตอน (Steps)
- ฟังก์ชัน setq ใช้สำหรับกำหนดตัวแปร มีโครงสร้างดังนี้ (setq ชื่อตัวแปร ค่าตัวแปร)
i i i i i i i ooooo o ooooooo ooooo ooooo I I I I I I I 8 8 8 8 8 o 8 8 I \ `+' / I 8 8 8 8 8 8 \ `-+-' / 8 8 8 ooooo 8oooo `-__|__-' 8 8 8 8 8 | 8 o 8 8 o 8 8 ------+------ ooooo 8oooooo ooo8ooo ooooo 8 Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/> Copyright (c) Bruno Haible, Michael Stoll 1992, 1993 Copyright (c) Bruno Haible, Marcus Daniels 1994-1997 Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998 Copyright (c) Bruno Haible, Sam Steingold 1999-2000 Copyright (c) Sam Steingold, Bruno Haible 2001-2010 Type :h and hit Enter for context help. [1]> (setq x 1) 1 [2]> x 1
- จาก “code” ข้างต้นจะเห็นว่า มีการกำหนดชื่อตัวแปร “x” และให้ค่าเท่ากับ “1” จากนั้นเมื่อลองเรียกใช้ตัวแปร “x” พบว่าจะมีการแสดงค่า “1” ตามที่ได้จดจำไว้ในหน่วยความจำ ซึ่งในโครงสร้างของภาษา “lisp” สามารถซ้อน “List” ได้ดังนี้
[3]> (setq x (* 5 6)) 30
- ในอาร์กิวเมนที่สองเป็นค่าที่จะต้องให้กับค่าตัวแปรในอาร์กิวเมนต์ที่หนึ่ง บางครั้งเราสามารถใส่ค่าอักขระเข้าไปได้โดยไม่จำเป็นต้องเป็นค่าของตัวแปร แต่จะต้องอยู่ภายใต้ฟังก์ชัน (quote …) หรือใช้ ‘… เพราะถ้าไม่อย่างนั้นโปรแกรมพยายามประมวลผลเพื่อหาค่า และถ้าไม่เคยกำหนดค่าจะเกิด “error” ดังนี้
Break 5 [4]> (setq x apple) *** - SETQ: variable APPLE has no value The following restarts are available: USE-VALUE :R1 Input a value to be used instead of APPLE. STORE-VALUE :R2 Input a new value for APPLE. ABORT :R3 Abort debug loop ABORT :R4 Abort debug loop ABORT :R5 Abort debug loop ABORT :R6 Abort debug loop ABORT :R7 Abort debug loop ABORT :R8 Abort main loop
- ลองทดสอบอีกครั้ง
[5]> (setq x 'apple) APPLE
- ต่อมาฟังก์ชัน set คล้ายกับ setq มันคล้ายกันมากแต่ภาษา lisp ดันมีวิธีกำหนดค่าตัวแปรแบบพิศดารคือ สามารถกำหนดตัวแปรให้กับตัวแปรได้ เออ…เคยได้ยินว่ากำหนดค่าให้กับตัวแปร ลองพิจารณาตัวอย่างดังต่อไปนี้
[1]> (setq x 'apple) APPLE [2]> x APPLE [3]> (set apple 1) *** - SYSTEM::READ-EVAL-PRINT: variable APPLE has no value The following restarts are available: USE-VALUE :R1 Input a value to be used instead of APPLE. STORE-VALUE :R2 Input a new value for APPLE. ABORT :R3 Abort main loop Break 1 [4]> apple *** - SYSTEM::READ-EVAL-PRINT: variable APPLE has no value The following restarts are available: USE-VALUE :R1 Input a value to be used instead of APPLE. STORE-VALUE :R2 Input a new value for APPLE. ABORT :R3 Abort debug loop ABORT :R4 Abort main loop Break 2 [5]> (set x 1) 1 Break 2 [5]> apple 1 Break 2 [5]> x APPLE
- จากผลการทดลองข้างต้นพบว่า
- ‘apple ถูกใส่ค่าเข้าไปในตัวแปร x
- จากนั้นลองทดสอบดึงค่าจากตัวแปร x ก็พบว่าเป็น apple
- ต่อจากนั้นลองใส่ค่า 1 ไปยัง apple แต่ใช้ set พบว่าตัวแปร apple ยังไม่เคยถูกกำหนด จึงแสดง error ออกมา
- ที่นี้ลองใส่ 1 เข้าไปในตัวแปร x อีกครั้ง แต่ใช้ set
- ลองทดสอบเรียกค่าตัวแปร x แต่กลับพบว่ายังคงเป็น ‘apple แทนที่จะเป็น 1
- ลองเรียกตัวแปร apple พบว่าถูก assign ค่าเป็น 1 เข้ามาอัตโนมัติ เช่นกัน