3/28/2013

Data Types ใน Tcl

หลักๆ เราคงจะรู้อยู่แล้่วว่าหลักๆ ยังไงต้องมีตัวเลข(Number) และข้อความ(String) ล่ะ ซึ่งก็ยังไม่ได้ดูนะว่า Data Type ของมันหน้าตาเป็นไง(Number มันเดาง่ายอยู่ล่ะ) แต่ก็มีคำถามที่คิดในหัวอยู่ล่ะหลักๆ คือ
  1. floating point มันเป็นอีก type มั้ย?
  2. จากที่เราเห็นข้างบนคำว่า pineapple มันเป็น Type อะไร?
  3. แล้วมันมี Type อื่นๆ อีกมั้ย
นั่งหาข้อมูลอยู่นานว่ามันจะทำยังไงให้เรารู้ว่า มันคือ Number หรือ String หาไปหามาก็เจอ link นี้ บอกว่า Tcl น่ะ มีแค่ String นะแต่ ห๊ะ อะไรนะ มันมีแค่ String!! จริงๆ คือมันไม่ได้มี Number Floating หรือ type หลักๆ ที่เราใช้กันเลย ทุกอย่างจะเป็น String หรือมองว่าเป็น Object ก็ได้ และเวลา มี Operator อะไรมากระทำมันก็จะเปลี่ยนแลงตรงนั้นให้เป็นค่าที่ต้องการเอง ซึ่งก็ตอบข้อ 1. กับ 2. ที่ผมสงสัยได้เลย แต่สงสัยขึ้นมาว่า

"แล้วเราจะตรวจสอบมันยังไง"

เพราะเวลาที่เราต้องมี Data Type เหตุผลส่วนหนึ่งเราต้องการตรวจสอบมันว่าเป็นอะไร หาไปหามาก็เจอ link นี้บอกว่า เราสามารถตรวจสอบได้ด้วยว่ามันคืออะไร โดยใช้

% string is type varName

ยกตัวอย่าง

% set a 5
5
% string is integer $a
1

สังเกตจากข้างบนมันจะ return ได้ออกมาเป็น 1 ซึ่งผมก็เดาไปเรื่อยว่ามันน่าจะใช่ หรือ true ล่ะมั้ง เลยเดาจากคำถามข้อ 1. ว่า floating point มันจะเป็น Data Type ชื่ออะไรโดยเริ่มจาก

% set a 0.1 ; # อันนี้ก็ลองเดาจากประสบการณ์การเขียนภาษาอื่นมา และมันก็ผ่านซะด้วย
0.1
% string is float $a
bad class "float": must be alnum, alpha, ascii, control, boolean, digit, double, entier, false, graph, integer, list, lower, print, punct, space, true, upper, wideinteger, wordchar, or xdigit

อ่าว มันด่ากลับมา T^T แสดงว่า floating point ของ Tcl ไม่ได้เรียกว่า float เอาล่ะงั้นลองไล่อ่านดูจากที่มันบอกล่ะกันว่าจะเป็นอันไหน ซึ่งก็เห็นว่ามันมีคำว่า double ซึ่งดูจะเข้าเค้าสุด

% set a 0.1
0.1
% string is double $a
1

เยส floating point ของ Tcl มันคือ double นั้นเอง แต่เห็นมัน return 1 ออกมาเลยอยากทดสอบดูว่ามันเป็น boolean จริงมั้ยโดย

% set a 1
1
% string is boolean $a
1
% string is true $a
1

"แล้ว Type อื่นล่ะไม่มีเลยจริงๆ เหรอ"

ผมก็ยังข้องใจอยู่ดีว่ามันไม่มีเลยเหรอ Data Type แบบอื่นเนี่ย พออ่านจาก link แรกแล้วก็พบว่ายังมีอีกนะ เช่น
  • Arrays (เห็นมันบอกว่าเป็น String Arrays)
  • Lists
  • Handles
  • Widgets
  • Byte Codes
เขียนหมดนี่คงเยอะไว้ขึ้นหัวข้อหน้าดีกว่า

Hello World กับ Tcl

ผมได้รับคำสั่งให้เรียน Tcl เพื่อเอาไปทำงานลับบางอย่าง :) เมื่อเริ่มก็ต้องหาทางให้มัน Hello World ให้ได้ก่อน โดยเริ่มจาก

ลง Tcl ผมใช้ OS X เพราะงั้นก็จัดผ่าน Homebrew ซะเลย

$ brew install tcl-tk

ลงเสร็จปรากฎว่ายังใช้ไม่ได้เลยเพราะ มี Tcl version 8.5 อยู่ในเครื่องแล้ว :( เพราะงั้นก็เลยใช่วิธีแก้ปัญหาเฉพาะหน้าไปด้วยการ

export TCL_HOME="/usr/local/Cellar/tcl-tk/8.6.0"
export PATH="$TCL_HOME/bin:$PATH"

จากนั้นก็ลอง ตรวจสอบ tcl ดูว่ามันเป็นไปตามที่เรา export หรือไม่โดยการ

$ ls -la `which tclsh`
[censor] /usr/local/Cellar/tcl-tk/8.6.0/bin/tclsh -> /usr/local/Cellar/tcl-tk/8.6.0/bin/tclsh8.6

โอ้วว เยส!!  มันได้ผล เพราะงั้นก็จัดเลย สร้างไฟล์ hello.tcl แล้วเปิดขึ้นมาแล้วจัด

puts "Hello World"

สั่งเซฟ แล้วจัดการรันโดยใช้

$ tclsh hello.tcl
Hello World

โอเคผ่าน :) พรุ่งนี้ค่อยทำความเข้าใจมันว่าเป็นมาอย่างไร

3/07/2013

ทำ trailing whitespace ตอนบันทึกไฟล์

เนื่องจาก git มันแคร์เรื่อง trailing whitespace มากเลยต้องหาวิธีตัดออกซึ่งใน vim ทำได้โดย

%s/\s\+$//

ซึ่งทำแบบนี้ต้องทำทุกครั้งก่อนที่เราจะเซฟซึ่งมันเหนื่อยและดูยุ่งยากโดยไม่จำเป็นเลยลองเขียน script ลงไปใน vimrc ซึ่งก็ได้ผลออกมาดังนี้
ซึ่งโค้ดข้างบนหมายความว่าทุกครั้งก่อนที่จะเขียนไฟล์หรือ buffer ให้ call function TrailingWhiteSpace ก่อนทุกครั้ง