В Схеме, какой смысл “набора!”?

Пример 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 года

22
задан HS. 8 February 2009 в 17:36
поделиться

4 ответа

Хотя оба 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 функция), любые имена, определенные в том объеме, маскируют имена, которые появляются в объеме включения. Это означает что когда мы defined x кому: 4 в foo, мы действительно создали новую стоимость для x то затененное старое значение. В bar, с тех пор foo не существует в том объеме, set! смотрит на объем включения, чтобы найти, и измениться, значение x.

Кроме того, как другие люди сказали, Вы, как только предполагается, define имя однажды в объеме. Некоторые реализации позволят Вам сойти с рук несколько defines, и некоторые не будут. Кроме того, Вы, как только предполагается, используете set! на переменной это уже было defined. Снова, как строго это правило осуществляется, зависит от реализации.

39
ответ дан 29 November 2019 в 04:15
поделиться

Это обычно не разрешается к 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 с.

6
ответ дан Henk 29 November 2019 в 04:15
поделиться

При использовании лексической привязки, Вы делаете не define их:

(let ((x 1))
  (set! x (+ x 1))
  x)
3
ответ дан kmkaplan 29 November 2019 в 04:15
поделиться

Когда Вы используете, определяют Вас, создают новую переменную с новым значением, в то время как старая переменная все еще существует со старым значением; это просто скрыто новым. На командной строке Вы не видите различия для установки!, но определите, не будет применимо для, например, счетчик цикла в обязательной программе.

2
ответ дан starblue 29 November 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: