Các cú pháp cơ bản

Một phần của tài liệu Nghiên cứu lập trình phản ứng với ngôn ngữ ELM (Trang 29 - 33)

Trong một chƣơng trình Elm để chú thích một dòng văn bản ta sử dụng ký hiệu là 2 dấu gạch ngang “-- “ ở đầu dòng. Nếu chú thích một đoạn văn bản ta sử dụng ký hiệu sau: “{----}”

{--

Đoạn văn bản được chú thích… --}

Cũng giống các ngôn ngữ lập trình khác, đầu tiên chúng ta sẽ kết nối với các thƣ viện sẵn có bằng từ khóa Import. Mỗi thƣ viện đều chứa các chức năng riêng của chúng. Tiếp theo chúng ta xem cách khai báo biến và hàm trong Elm.

Đoạn mã bên dƣới sẽ khai báo một biến và giá trị của nó dạng String. Hàm main sẽ hiển thị chuỗi ra ngoài màn hình bằng hàm show.

var1 = "Hello, chào mừng bạn đến với Elm"

main = show var1

Tiếp đến ta khai báo hàm:

fn1 var1 =

if var1 > 10 then "Hello" else "Lucky"

main = show (fn1 100)

Đoạn mã trên sẽ in ra dòng chữ "Lucky" vì giá trị truyền vào lớn hơn 10. Nếu hàm main đƣợc viết nhƣ sau: main = show [fn1 10, fn1 9, fn1 20]

Thì chƣơng trình sẽ in ra là một mảng nhƣ sau: ["Lucky","Lucky","Hello"] Ta xét tiếp các thao tác với hàm.

fn1 var1 =

if var1 >10 then "hello" else "Lucky"

fn2 var1 = var1*var1

fn3 var2 = var2^3

30

main = show (fn1 (fn3(fn2 var1)))

Với đoạn mã trên hàm main sẽ thực hiện thao tác hàm lồng hàm. Giá trị đƣợc in ra là "hello". Vì giá trị hàm main hiển thị ra là bằng 12 > 10.

Ta xét tiếp đến biểu thức đa điều kiện (Multi-way if-expressions) thực hiện một loạt chức năng với các giá trị khác nhau.

if | biểu thức 1 -> giá trị 1 | biểu thức 2 -> giá trị 2 | biểu thức 3 -> giá trị 3 | biểu thức n -> giá trị n | otherwise -> giá trị mặc định

Biểu thức Case – of cũng thực hiện một loạt chức năng với các giá trị khác nhau.

case n of 0 -> 1

1 -> 1

_ -> fib (n-1) + fib (n-2)

Một phần quan trọng trong chƣơng trình Elm là việc khai báo kiểu dữ liệu. cũng giống các ngôn ngữ lập trình thông dụng Elm sử dụng từ khóa type alias để khai báo một kiểu dữ liệu mới.

type alias Keys = {x: Int, y: Int}

type alias Input = {space: Bool, enter: Bool, dir1: Keys, dir2: Keys, delta: Time}

Ở đoạn mã trên có 2 kiểu dữ liệu đƣợc khai báo. Kiểu Input đƣợc khai báo nhƣ các tín hiệu đầu vào của chƣơng trình gồm phím Space, phím Enter, các phím mũi tên (Arrows), các phím (w, a, s, d) và cả tín hiệu thời gian delta.

Còn kiểu Keys có giá trị là một cặp số nguyên thƣờng thể hiện giá trị nhập vào từ bàn phím. Giá trị ban đầu của nó thƣờng là: { x = 0, y = 0 }

Xét đoạn mã dƣới đây:

import Graphics.Element exposing (..) import Keyboard

main : Signal Element

31

Khi phím mũi tên bên trái và múi tên hƣớng phía dƣới đƣợc nhấn thì giá trị là -1, và mũi tên bên phải với mũi tên hƣớng phía trên đƣợc nhấn thì giá trị sẽ là +1.

Hầu hết trong chƣơng trình dữ liệu đƣợc khai báo kiểu bản ghi, mục đích là cấu trúc lại các dữ liệu liên quan một cách rõ ràng làm cho nó dễ dàng truy cập và cập nhật dữ liệu.

test = { x = 5 , y = 10}

main = show { test | x <- 10, y <- 20 }

Đoạn mã trên sẽ tạo một bản ghi giá trị mặc định là là x = 5 và y = 10 sau đó hàm main sẽ cập nhật bản ghi với giá trị mới là x = 10 và y = 20. Để truy cập bản ghi ta chỉ cần viết test.x hay test.y, ngoài ra còn một số thao tác vơi bản ghi nhƣ:

{ test - x } -- hủy trường

{ test | z = 12 } -- thêm trường

{ test - x | z = point.x } -- đổi tên trường

{ test - x | x = 6 } -- cập nhật trường

Trong một ứng dụng việc hiển thị văn bản ra ngoài màn hình cũng khá quan trọng. Elm cũng vậy nó cung cấp thƣ viện Text cũng khá là đầy đủ.

main = collage 600 600 [

toForm (Markdown.toElement "<b> hello </b> ! <br/> <b> chao mung ban den voi ELM !</b>")

|> move(-80, 80)

, toForm (

centered (Text.fromString "cac kieu dinh dang font chu!" |> Text.bold -- kiểu chữ đậm |> Text.color red -- Mầu chữ |> Text.height 30 -- kích cỡ chữ |> Text.monospace -- kiểu chữ đơn ) ) ]

Xét đoạn mã trên ta thấy hàm main sẽ thực thi chƣơng trình và in ra hai dòng chữ với đầy đủ các thuộc tính nhƣ mầu sắc, kích, loại font, nét chữ…

32

Markdown.toElement ở dạng html và Text.fromString ở dạng String vì vậy trƣớc chúng đều có từ khóa toForm để ép kiểu sang kiểu Form vì hàm collage chứa tập các thành phần ở dạng Form. Xét một ví dụ nhỏ về ép kiểu:

test : String -> Float -> String

test bien1 bien2 = bien1 ++ (toString bien2) main = show (test "Tuoi cua ban la: " 18)

Đoạn mã trên khai báo một hàm test có 2 tham số đầu vào một chuỗi và một kiểu số thực nhƣng kết quả lại trả về một chuỗi vì vậy ta sẽ phải ép kiểu biến 2 thành chuỗi với từ khóa toString. Kết quả chƣơng trình sẽ in ra và không báo lỗi. Việc nối các chuỗi lại với nhau thực hiện thông qua ký hiệu: ++

Ngoài ra trong Elm còn sử dụng một số ký tự để thay thế các cách viết khác nhau. Ký tự ( <| ) ( |> ) dùng để thay thế dấu ngoặc đơn.

Ví dụ ta tạo một hình tròn có thể viết nhƣ sau:

move (0, -160) (scale 2 (filled blue (circle 10)))

Hoặc cũng có thể viết: circle 15 |> filled blue |> scale 2 |> move (0, -50) Ngƣời lập trình có thể sử dụng ký tự ( <~ ) và ( ~ ) sử dụng nhƣ một hàm để nối các tín hiệu lại với nhau. Nó tƣơng tự nhƣ việc sử dụng hàm map.

Ví dụ ta viết một hàm gồm 5 tín hiệu đầu vào sử dụng hàm map5 nhƣ sau: input = Signal.sampleOn delta

<| (Signal.map5 Input

33 Keyboard.space Keyboard.enter

Keyboard.arrows Keyboard.wasd delta)

Ta cũng có thể viết lại nhƣ sau sử dụng ký tự ( <~ ) để thay thế hàm map. input = Signal.sampleOn delta

<| (Input <~ Keyboard.space ~ Keyboard.enter ~ Keyboard.shift ~ Keyboard.arrows ~ Keyboard.wasd ~ delta)

Một phần của tài liệu Nghiên cứu lập trình phản ứng với ngôn ngữ ELM (Trang 29 - 33)