XCTLRuntimeVariable.swift 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. //
  2. // XCTLRuntimeVariable.swift
  3. // notebook
  4. //
  5. // Created by 邢铖 on 2023/5/18.
  6. //
  7. import Foundation
  8. public class XCTLRuntimeVariable: NSObject {
  9. public var type: XCTLRuntimeVariableType
  10. public var rawValue: String
  11. public var rawObject: NSObject?
  12. public var rawFunction: (([XCTLRuntimeVariable]) throws -> XCTLRuntimeVariable)?
  13. // public var leftValue: XCTLRuntimeVariable?
  14. // public var leftValueMemberName: String?
  15. internal weak var rawFunctionStatement: XCTLStatement?
  16. public func toString() -> String {
  17. if type == .typeFuncImpl || type == .typeFuncIntrinsic {
  18. return "Function"
  19. }
  20. if type == .typeObject {
  21. return self.rawObject?.description ?? ""
  22. }
  23. return self.rawValue
  24. }
  25. public init(type: XCTLRuntimeVariableType, rawValue: String) {
  26. self.type = type
  27. self.rawValue = rawValue
  28. self.rawObject = nil
  29. self.rawFunction = nil
  30. }
  31. public init(rawObject: NSObject) {
  32. self.type = .typeObject
  33. self.rawValue = ""
  34. self.rawObject = rawObject
  35. self.rawFunction = nil
  36. }
  37. public init(funcImpl: @escaping ([XCTLRuntimeVariable]) throws -> XCTLRuntimeVariable) {
  38. self.type = .typeFuncIntrinsic
  39. self.rawValue = ""
  40. self.rawObject = nil
  41. self.rawFunction = funcImpl
  42. }
  43. internal init(funcImplStmt: XCTLStatement) {
  44. self.type = .typeFuncImpl
  45. self.rawValue = ""
  46. self.rawObject = nil
  47. self.rawFunction = nil
  48. self.rawFunctionStatement = funcImplStmt
  49. }
  50. public var stringValue: String {
  51. return self.rawValue
  52. }
  53. public var intValue: Int {
  54. return Int(self.rawValue)!
  55. }
  56. public var doubleValue: Double {
  57. return Double(self.rawValue)!
  58. }
  59. public var boolValue: Bool {
  60. return Bool(self.rawValue)!
  61. }
  62. public var objectValue: NSObject {
  63. return self.rawObject!
  64. }
  65. public static var void: XCTLRuntimeVariable {
  66. return XCTLRuntimeVariable(type: .typeVoid, rawValue: "")
  67. }
  68. public var nativeValue: Any {
  69. switch self.type {
  70. case .typeVoid:
  71. return NSNull()
  72. case .typeObject:
  73. return self.objectValue
  74. case .typeString:
  75. return self.stringValue
  76. case .typeNumber:
  77. return self.doubleValue
  78. case .typeBoolean:
  79. return self.boolValue
  80. case .typeFuncIntrinsic:
  81. return self.rawFunction ?? NSNull()
  82. case .typeFuncImpl:
  83. return NSNull()
  84. }
  85. }
  86. public func executeFunc(arg: [XCTLRuntimeVariable]) throws -> XCTLRuntimeVariable {
  87. return try self.rawFunction!(arg)
  88. }
  89. }