2010-04-30 14 views
11

que acaba de comenzar el aprendizaje F #, y trató de un código de the wiki:#indent "off" en F #

prefiero lengüetas a los espacios, por lo que cambiar el código un poco en esto:

#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) 

La salida es:

Microsoft (R) F # 2.0 Compiler construir 4.0.30319.1 copyright (C) Microsoft Corporation. Todos los derechos reservados.

fstest2.fs (1,1): advertencia FS0062: Esta construcción es compatible con ML. Considere usar un archivo con la extensión '.ml' o '.mli' en su lugar. Puede desactivar esta advertencia utilizando '--mlcompatibility' o '--nowarn: 62'.

fstest2.fs (9,2): error FS0010: Palabra clave inesperada 'let' o 'use' en expresión. Se espera 'en' u otro token .

fstest2.fs (13,1): FS0597 error: argumentos sucesivos deben separados por spac es o tupled, y argumentos implican una función o método aplicaciones deben paréntesis

fstest2.fs (9 , 14): error FS0374: expresión no válida en la izquierda del asignación

fstest2.fs (16,1): FS0010 error: identificador inesperado en la definición

Adivina el error en algún lugar del let etiqueta bloque, pero no pudo resolverlo.

+2

¡Jajaja, solo prueba de que preferir pestañas a espacios es INCORRECTO, INCORRECTO, INCORRECTO! :) – Benjol

+9

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

Respuesta

13

Si utiliza "#indent off", entonces perderá toda la sintaxis simple de whitespace aware, y tendrá que volver a usar, por ejemplo,

#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)  

con punto y coma y in s y todos los otros tipos de ruido sintáctica en todas partes. Probablemente será más feliz que el editor convierta las pestañas en espacios (y tenga un editor inteligente que pueda tratar los espacios como si fueran pestañas, por ejemplo, para que el retroceso haga una copia de seguridad de una sola pestaña).

+0

Al igual que en OCaml, los ';;' no son necesarios aquí. – Laurent

6

Este tema ya fue discutido in this StackOverflow question. Como explica Brian, apagar la sintaxis "liviana" significa que tendrá que escribir en la sintaxis compatible con OCaml.

Creo que en la mayoría de los casos, la sintaxis basada en la sangría es más legible (por lo que vale la pena cambiar de tabuladores a espacios). Sin embargo, la sintaxis con ruido adicional (como in y ;;) revela más sobre la estructura del lenguaje, por lo que puede ser útil jugar con él brevemente mientras aprende F #.

El siguiente ejemplo muestra todas las cosas adicionales que usted necesita para escribir:

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 

Para más discusiones, see also this post.

+1

anta40 dice "Prefiero las pestañas a los espacios". No está del todo claro por qué las pestañas no están permitidas para la sangría en F # para la sintaxis de la luz? Imagínese, alguien tiene su editor de texto favorito y algunas herramientas de texto y solo hábitos cultivados y pulidos durante años para pestañas, no para espacios ... y ahora solo hay dos opciones para F #: espacios-luz encendida, pestañas-luz apagada. –

+4

@ anta40 - IIRC, el problema es que los editores diferentes pueden usar diferentes tabulaciones de ancho y también mezclar espacios. Dado que los cambios en el ancho de la pestaña podrían cambiar el nivel de sangría de una línea determinada, eso también podría cambiar el significado del programa en sí, lo que daría lugar a errores muy difíciles de detectar. –

+1

@JamesHugard La pestaña es solo un personaje en sí mismo. No tiene 'ancho'. El ancho de la pestaña es solo un concepto gráfico para mostrar texto. Sin embargo, estoy de acuerdo en que mezclar pestañas y espacios podría provocar errores difíciles de detectar. – MEMark