Javascript生成器和Clojure lazy-seq在概念上是一样的

时间:2017-05-13 16:34:26

标签: javascript clojure lazy-evaluation

Javascript生成器函数和Clojure lazy-seq函数的目标是否在概念上相同,即从函数中返回懒惰的评估值列表?或者是否有一些不同的用例? Clojure是否使用熟悉的机制来实际实现lazy-seq?

1 个答案:

答案 0 :(得分:0)

Javascript生成器是可变的。 Clojure懒惰序列不是。

Clojure有一个专门的懒惰序列机制。要创建一个,您可以调用// // UIView-Extension.swift // import Foundation import UIKit @IBDesignable extension UIView { // Shadow @IBInspectable var shadow: Bool { get { return layer.shadowOpacity > 0.0 } set { if newValue == true { self.addShadow() } } } fileprivate func addShadow(shadowColor: CGColor = UIColor.black.cgColor, shadowOffset: CGSize = CGSize(width: 3.0, height: 3.0), shadowOpacity: Float = 0.35, shadowRadius: CGFloat = 5.0) { let layer = self.layer layer.masksToBounds = false layer.shadowColor = shadowColor layer.shadowOffset = shadowOffset layer.shadowRadius = shadowRadius layer.shadowOpacity = shadowOpacity layer.shadowPath = UIBezierPath(roundedRect: layer.bounds, cornerRadius: layer.cornerRadius).cgPath let backgroundColor = self.backgroundColor?.cgColor self.backgroundColor = nil layer.backgroundColor = backgroundColor } // Corner radius @IBInspectable var circle: Bool { get { return layer.cornerRadius == self.bounds.width*0.5 } set { if newValue == true { self.cornerRadius = self.bounds.width*0.5 } } } @IBInspectable var cornerRadius: CGFloat { get { return self.layer.cornerRadius } set { self.layer.cornerRadius = newValue } } // Borders // Border width @IBInspectable public var borderWidth: CGFloat { set { layer.borderWidth = newValue } get { return layer.borderWidth } } // Border color @IBInspectable public var borderColor: UIColor? { set { layer.borderColor = newValue?.cgColor } get { if let borderColor = layer.borderColor { return UIColor(cgColor: borderColor) } return nil } } } 宏。这将其body-form包装为lazy-sequence对象内的无参数Clojure函数(实现clojure.lang.Ifn的对象),该对象基本上记忆了序列协议。