2010-04-30 29 views
11

Tôi chỉ mới bắt đầu học F #, và thử một mã từ the wiki:#indent "tắt" trong F #

tôi thích tab để không gian, vì vậy tôi thay đổi mã một chút vào này:

#indent "off" 
open System 
open System.Windows.Forms 

let form = new Form(Visible=true, TopMost=true, Text="Welcome to F#") 

let label = 
    let temp = new Label() 
    let x = 3 + (4 * 5) 
    temp.Text <- sprintf "x = %d" x 
    temp 

form.Controls.Add(label) 

[<STAThread>] 
Application.Run(form) 

Đầu ra là:

Microsoft (R) F # 2.0 Biên dịch xây dựng 4.0.30319.1 Bản quyền (c) Tập đoàn Microsoft. Đã đăng ký Bản quyền.

fstest2.fs (1,1): cảnh báo FS0062: Cấu trúc này dành cho khả năng tương thích ML. Thay vào đó, hãy sử dụng tệp có phần mở rộng là '.ml' hoặc '.mli'. Bạn có thể vô hiệu hóa cảnh báo này bằng cách sử dụng '--mlcompatibility' hoặc '--nowarn: 62'.

fstest2.fs (9,2): lỗi FS0010: Từ khóa không mong muốn 'let' hoặc 'use' trong biểu thức . Mã thông báo 'in' hoặc khác được mong đợi.

fstest2.fs (13,1): Lỗi FS0597: tranh luận kế tiếp nên được ngăn cách bởi spac es hoặc tupled, và tranh cãi liên quan đến chức năng hoặc phương pháp ứng dụng nên ngoặc

fstest2.fs (9 , 14): lỗi FS0374: biểu hiện không hợp lệ trên bên trái của phân

fstest2.fs (16,1): lỗi FS0010: định bất ngờ trong định nghĩa

Đoán lỗi ở đâu đó trong số cho phép nhãn chặn, nhưng không thể tìm ra được.

+2

Hahaha, chỉ bằng chứng cho thấy các tab thích hợp với không gian là WRONG, WRONG, WRONG! :) – Benjol

+9

@Benjol ... {angry-face-emoji} – stun

Trả lời

13

Nếu bạn sử dụng "#indent off", thì bạn sẽ mất tất cả cú pháp nhận biết khoảng trắng đơn giản hơn và phải quay lại sử dụng ví dụ:

#indent "off" 

open System 
open System.Windows.Forms 

let label = 
    let temp = new Label() in 
    let x = 3 + (4 * 5) in 
    temp.Text <- sprintf "x = %d" x; 
    temp;; 

let form = 
    let f = new Form() in 
    f.Controls.Add(label); 
    f;; 

[<STAThread>] 
do Application.Run(form)  

với dấu chấm phẩy và in s và tất cả các loại tiếng ồn cú pháp khác ở mọi nơi. Có thể bạn sẽ hạnh phúc hơn khi trình chỉnh sửa của mình chuyển đổi các tab thành dấu cách (và có một trình chỉnh sửa thông minh có thể xử lý các khoảng trống như thể chúng là các tab, ví dụ như sao lưu có thể sao lưu một tab).

+0

Như trong OCaml, ';;' không bắt buộc ở đây. – Laurent

6

Chủ đề này đã được thảo luận in this StackOverflow question. Như Brian giải thích, việc tắt cú pháp "nhẹ" có nghĩa là bạn sẽ phải viết cú pháp tương thích với OCaml.

Tôi tin rằng trong hầu hết các trường hợp, cú pháp dựa trên thụt đầu dòng dễ đọc hơn (và do đó, nó đáng để chuyển từ tab này sang không gian khác). Tuy nhiên, cú pháp với tiếng ồn bổ sung (chẳng hạn như in;;) tiết lộ thêm về cấu trúc của ngôn ngữ, vì vậy có thể hữu ích khi chơi với nó một thời gian ngắn trong khi học F #.

Ví dụ sau đây cho thấy tất cả những điều bổ sung mà bạn cần phải viết:

let add a b c = 
    let ab = a + b in // 'in' keyword specifies where binding (value 'ab') is valid 
    printfn "%d" ab; // ';' is operator for sequencing expressions 
    c - ab;;   // ';;' is end of a function declaration 

Đối với các cuộc thảo luận hơn, see also this post.

+1

anta40 nói “Tôi thích các tab đến không gian”. Nó không phải là khá rõ ràng tại sao các tab không được phép cho indentation trong F # cho cú pháp ánh sáng? Hãy tưởng tượng, ai đó có trình soạn thảo văn bản yêu thích của mình và một số công cụ văn bản và thói quen phát triển và đánh bóng trong nhiều năm cho các tab, không phải cho không gian… và bây giờ chỉ có hai lựa chọn cho F #: không gian ánh sáng, tab-ánh sáng. –

+4

@ anta40 - IIRC, sự cố là các trình chỉnh sửa khác nhau có thể sử dụng các điểm dừng tab có độ rộng khác nhau và cũng có thể kết hợp trong không gian. Vì những thay đổi về độ rộng của tab có thể thay đổi mức thụt đầu dòng của bất kỳ dòng nào, điều đó cũng có thể thay đổi ý nghĩa của chương trình, dẫn đến rất khó nhận thấy lỗi. –

+1

@JamesHugard Tab chỉ là một ký tự. Nó không có 'chiều rộng'. Chiều rộng của tab chỉ là một khái niệm đồ họa để hiển thị văn bản. Tôi đồng ý rằng việc trộn các tab và dấu cách có thể gây khó khăn khi nhận thấy các lỗi. – MEMark