2009-08-06 8 views
2

In LISP-ähnlichen Sprachen sind alle Sprachkonstrukte erstklassige Bürger.Können alle Sprachkonstrukte in Sprachen mit Abseitsregeln erstklassig sein?

Betrachten Sie das folgende Beispiel in Dylan:

let x = if (c) 
      foo(); 
     else 
      bar(); 
     end; 

und in LISP:

(setf x (if c (foo) (bar))) 

In Python müsste man schreiben:

if c: 
    x = foo(); 
else: 
    x = bar(); 

Da Python-Anweisungen und Ausdrücke destinguishes .

Können alle Sprachkonstrukte in einer Sprache, die der Offside-Regel folgt (eine einrückungsbasierte Syntax hat) Ausdrücke sein, so dass Sie sie Variablen zuweisen oder als Parameter übergeben können?

+1

ich nicht so sicher bin, wenn Ausdruck in Lisp es so einfach, wie es klingen mag ... es ist eine besondere Form, weil sie mit den gleichen Regeln wie eine einfache Funktion nicht ausgewertet sind . – fortran

Antwort

4

Ich sehe nicht, die Beziehung mit der ersten classness hier - du bist nicht das Bestehen der ifAnweisung auf die Funktion, aber das Objekt, um es zurückgibt, die wie in Lisp als vollständig erste Klasse in Python ist. Was jedoch eine Aussage-/Ausdrucksdichotomie betrifft, ist es eindeutig möglich: Haskell hat zum Beispiel eine indentationsbasierte Syntax, hat aber als rein funktionale Sprache offensichtlich keine Aussagen.

Ich denke, Pythons Trennung hier hat mehr damit zu tun, gefährliche Konstrukte wie "if x = 4:" usw. zu verbieten, als irgendeine Syntaxbeschränkung. (Obwohl ich denke, dass es mehr verliert als es dadurch gewinnt - manchmal ist die Flexibilität ausreichend, um von Ihrem Fuß abzuschießen sehr wertvoll, selbst wenn Sie das Risiko eingehen, ein paar Zehen hin und wieder zu verlieren.)

9

Python hat die folgende Syntax dass führt die gleiche Sache:

x = foo() if c else bar() 
+0

Ja, ich weiß nicht, warum das OP sonst gesagt hat. Sie können sogar tun: "y = foo wenn c else bar; x = y()" wenn Sie wollen. – hughdbrown

+0

Wie würde dies beim Überfahren mehrerer Zeilen eingerückt werden? – Svante

Verwandte Themen