Пример Swift, который действительно работает:
switch UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch) {
case .OrderedSame, .OrderedDescending:
println("iOS >= 8.0")
case .OrderedAscending:
println("iOS < 8.0")
}
Не используйте NSProcessInfo, потому что он не работает под 8.0, поэтому его почти бесполезно до 2016 года
Хотя оба define
и set!
переопределит значение, когда в том же объеме, они делают две разных вещи, когда объем отличается. Вот пример:
(define x 3)
(define (foo)
(define x 4)
x)
(define (bar)
(set! x 4)
x)
(foo) ; returns 4
x ; still 3
(bar) ; returns 4
x ; is now 4
Как Вы видите, когда мы создаем новый лексический контекст (такой как тогда, когда мы define
функция), любые имена, определенные в том объеме, маскируют имена, которые появляются в объеме включения. Это означает что когда мы define
d x
кому: 4
в foo
, мы действительно создали новую стоимость для x
то затененное старое значение. В bar
, с тех пор foo
не существует в том объеме, set!
смотрит на объем включения, чтобы найти, и измениться, значение x
.
Кроме того, как другие люди сказали, Вы, как только предполагается, define
имя однажды в объеме. Некоторые реализации позволят Вам сойти с рук несколько define
s, и некоторые не будут. Кроме того, Вы, как только предполагается, используете set!
на переменной это уже было define
d. Снова, как строго это правило осуществляется, зависит от реализации.
Это обычно не разрешается к define
переменная несколько раз. Большинство REPLs позволяет его для удобства при испытании вещей, но при попытке сделать это в программе Схемы, то это даст Вам ошибку.
, Например, в mzscheme, программа
#lang scheme
(define x 1)
(define x 2)
дает ошибку
test.ss:3:8: module: duplicate definition for identifier at: x in: (define-values (x) 2)
, Кроме того, define
имеет другое значение при использовании в других контекстах. Программа
#lang scheme
(define x 1)
x
(let ()
(define x 2)
x)
x
имеет вывод
1
2
1
, Это вызвано тем, что define
с в определенных конструкциях на самом деле рассматривают как letrec
с.
При использовании лексической привязки, Вы делаете не define
их:
(let ((x 1))
(set! x (+ x 1))
x)
Когда Вы используете, определяют Вас, создают новую переменную с новым значением, в то время как старая переменная все еще существует со старым значением; это просто скрыто новым. На командной строке Вы не видите различия для установки!, но определите, не будет применимо для, например, счетчик цикла в обязательной программе.