diff --git a/amogus.mers b/amogus.mers new file mode 100644 index 0000000..6157c5f --- /dev/null +++ b/amogus.mers @@ -0,0 +1,19 @@ +text = "ℑ𝔠ð”Ĩ ð”Ļ𝔞ð”Ŧð”Ŧ ð”Ąð”žð”° ð”ģð”Ēð”Ŋð”Ąð”žð”Šð”Šð”ą ð”Ŧ𝔎𝔠ð”Ĩ 𝔊𝔞ð”Đ ð”Ŧð”Ķ𝔠ð”Ĩð”ą ð”Īð”Đ𝔞ð”ē𝔟ð”Ēð”Ŧ. 𝔓ð”Ķð”Ŧð”Ļ ð”ģ𝔎ð”Ŧ ð”ēð”Ŧð”ąð”Ēð”Ŋ ð”ēð”Ŧ𝔰 ð”Ĩð”žð”ą 𝔊ð”Ēð”Ķð”Ŧð”Ē 𝔈ð”Ĩð”Ē ð”Ŋð”ēð”Ķð”Ŧð”Ķð”Ēð”Ŋð”ą. 𝔙𝔎ð”Ŋ ð”Ēð”Ķð”Ŧ 𝔭𝔞𝔞ð”Ŋ 𝔐𝔎ð”Ŧð”žð”ąð”Ēð”Ŧ 𝔰𝔞ð”Īð”ąð”Ē 𝔊ð”Ēð”Ķð”Ŧð”Ē 𝔉ð”Ŋ𝔞ð”ē, 𝔰ð”Ķð”Ē ð”īð”ēĖˆð”Ŋð”Ąð”Ē ð”Ģð”ēĖˆð”Ŋ ð”Ēð”Ķð”Ŧð”Ē 𝔉ð”Ŋ𝔞ð”ēð”Ēð”Ŧð”Ŧ𝔞𝔠ð”Ĩð”ą 𝔞ð”ē𝔰ð”Īð”Ēð”Ĩð”Ēð”Ŧ. 𝔖ð”Ķð”Ē ð”Ÿð”žð”ą 𝔊ð”Ķ𝔠ð”Ĩ, 𝔞ð”ēð”Ģ 𝔊ð”Ēð”Ķð”Ŧð”Ēð”Ŧ 𝔖𝔎ð”Ĩð”Ŧ 𝔞ð”ēð”Ģ𝔷ð”ē𝔭𝔞𝔰𝔰ð”Ēð”Ŧ, 𝔞ð”Đ𝔰𝔎 ð”ī𝔞ð”Ŋ ð”Ķ𝔠ð”Ĩ 𝔰𝔎ð”Ģ𝔎ð”Ŋð”ą ð”ģð”Ēð”Ŋ𝔭ð”Ģð”Đð”Ķ𝔠ð”Ĩð”ąð”Ēð”ą. \"𝔍𝔞 𝔐𝔞'𝔞𝔊\", 𝔰𝔞ð”Īð”ąð”Ē ð”Ķ𝔠ð”Ĩ ð”Ķð”Ĩð”Ŋ. 𝔑𝔞𝔠ð”Ĩ ð”Ēð”Ķð”Ŧð”Ēð”Ŋ 𝔚ð”Ēð”Ķð”Đð”Ē ð”Ąð”Ē𝔰 𝔚𝔞ð”Ŋð”ąð”Ēð”Ŧ𝔰 ð”Īð”Ķð”Ŧð”Ī 𝔰ð”Ķð”Ē ð”Ēð”Ŧð”Ąð”Đð”Ķ𝔠ð”Ĩ ð”ēð”Ŧð”Ą ð”Ķ𝔠ð”Ĩ ð”Ļ𝔎ð”Ŧð”Ŧð”ąð”Ē 𝔊ð”Ēð”Ķð”Ŧ 𝔏ð”Ķð”Ē𝔟ð”Đð”Ķð”Ŧð”Ī𝔰𝔰𝔭ð”Ķð”Ēð”Đ ð”ēð”Ŧð”ąð”Ēð”Ŋ ð”ēð”Ŧ𝔰 𝔰𝔭ð”Ķð”Ēð”Đð”Ēð”Ŧ. ℑ𝔠ð”Ĩ ð”Ĩð”ēĖˆð”­ð”Ģð”ąð”Ē 𝔞ð”ēð”Ģ 𝔊ð”Ēð”Ķð”Ŧð”Ēð”Ŧ ð”ð”žð”­ð”ąð”Žð”­, ð”°ð”ąð”žð”Ŋð”ąð”Ēð”ąð”Ē ð”Ķð”Ĩð”Ŧ ð”ēð”Ŧð”Ą ð”Đð”ēð”Ą 𝔊ð”Ēð”Ķð”Ŧð”Ēð”Ŧ 𝔇ð”Ē𝔰ð”Ļð”ąð”Žð”­, ð”Ļ𝔎𝔊𝔭ð”Đð”Ēð”ąð”ą 𝔊ð”Ķð”ą ð”Ąð”Ē𝔊 ð”Ŋð”Žð”ąð”Ēð”Ŧ 𝔖ð”ē𝔰-ℌð”Ķð”Ŧð”ąð”Ēð”Ŋð”Īð”Ŋð”ēð”Ŧð”Ą ð”ēð”Ŧð”Ą 𝔞ð”Đð”Đ 𝔊ð”Ēð”Ķð”Ŧð”Ēð”Ŋ â„‘ð”Šð”­ð”Žð”°ð”ąð”Žð”Ŋ-𝔉𝔞ð”Ŧ-𝔄ð”Ŋð”ą ð”ēð”Ŧð”ąð”Ēð”Ŋ ð”ēð”Ŧ𝔰. ℑ𝔠ð”Ĩ 𝔷ð”Ķð”ąð”ąð”Ēð”Ŋð”ąð”Ē ð”ģ𝔎ð”Ŋ 𝔄ð”ēð”Ģð”Ŋð”Ēð”Īð”ēð”Ŧð”Ī. ℑ𝔠ð”Ĩ 𝔷𝔎ð”Ī 𝔊ð”Ēð”Ķð”Ŧð”Ēð”Ŧ 𝔉ð”Ķð”Ŧð”Īð”Ēð”Ŋ ð”Đ𝔞ð”Ŧð”Ī𝔰𝔞𝔊 ð”ēĖˆð”Ÿð”Ēð”Ŋ ð”Ąð”žð”° 𝔗ð”Ŋ𝔞𝔠ð”Ļð”­ð”žð”Ą ð”ēð”Ŧð”Ą 𝔟ð”Ē𝔎𝔟𝔞𝔠ð”Ĩð”ąð”Ēð”ąð”Ē ð”Ąð”Ēð”Ŧ ℭð”ēð”Ŋ𝔰𝔎ð”Ŋ, 𝔞ð”Đ𝔰 ð”Ēð”Ŋ 𝔷ð”ē ð”Ąð”Ē𝔊 𝔖ð”ķ𝔊𝔟𝔎ð”Đ ð”ēð”Ŧð”ąð”Ēð”Ŋ ð”ēð”Ŧ𝔰 ð”Īð”Đð”Ķð”ąð”ą. ð”ēð”Ŧð”ąð”Ēð”Ŋ ð”ēð”Ŧ𝔰. 𝔐ð”Ēð”Ķð”Ŧ 𝔞𝔟𝔰𝔎ð”Đð”ēð”ąð”Ē𝔰 𝔏ð”Ķð”Ē𝔟ð”Đð”Ķð”Ŧð”Ī𝔰𝔰𝔭ð”Ķð”Ēð”Đ 𝔞ð”Đð”Đð”Ēð”Ŋ â„Ļð”Ēð”Ķð”ąð”Ēð”Ŧ ð”ēð”Ŧð”Ą ð”ī𝔞ð”Ĩð”Ŋ𝔰𝔠ð”Ĩð”Ēð”Ķð”Ŧð”Đð”Ķ𝔠ð”Ĩ ð”Ąð”žð”° 𝔟ð”Ēð”°ð”ąð”Ē ð”ēð”Ŧð”Ą 𝔞𝔊 𝔟ð”Ēð”°ð”ąð”Ēð”Ŧ ð”Īð”Ē𝔊𝔞𝔠ð”Ĩð”ąð”Ē 𝔖𝔭ð”Ķð”Ēð”Đ ð”Ąð”Ēð”Ŋ 𝔚ð”Ēð”Đð”ą. 𝔄ð”Đ𝔰 ð”Ķ𝔠ð”Ĩ 𝔞ð”ēð”Ģ ð”Ąð”Ēð”Ŧ 𝔎ð”Ŧ𝔎𝔭ð”Ģ ð”Ļð”Đð”Ķ𝔠ð”Ļð”ąð”Ē, 𝔷ð”ē𝔠ð”Ļð”ąð”Ē 𝔊ð”Ēð”Ķð”Ŧ 𝔎𝔎Ėˆð”Ŋ𝔭ð”Ēð”Ŋ ð”ģ𝔎ð”Ŋ 𝔉ð”Ŋð”Ēð”ēð”Ąð”Ē 𝔟ð”Ēð”Ķ ð”Ąð”Ē𝔊 𝔊ð”Ēð”Ąð”žð”Ŧð”Ļð”Ēð”Ŧ, ð”īð”Ķð”Ēð”Ąð”Ēð”Ŋ ð”Ąð”Ēð”Ŋ 𝔅ð”Ēð”ąð”Ŋð”ēĖˆð”Īð”Ēð”Ŋ 𝔷ð”ē 𝔰ð”Ēð”Ķð”Ŧ. 𝔐ð”Ēð”Ķð”Ŧð”Ē 𝔉ð”Ķð”Ŧð”Īð”Ēð”Ŋ ð”ąð”Ŋ𝔎𝔊𝔊ð”Ēð”Đð”ąð”Ēð”Ŧ ð”ēð”Ŧð”Īð”Ēð”Ąð”ēð”Đð”Ąð”Ķð”Ī 𝔞ð”ēð”Ģ 𝔊ð”Ēð”Ķð”Ŧð”Ē𝔊 𝔖𝔠ð”Ĩð”Ŋð”Ēð”Ķð”Ÿð”ąð”Ķ𝔰𝔠ð”Ĩ, 𝔞ð”Đ𝔰 ð”Ąð”žð”° 𝔏𝔎ð”Ī𝔎 ð”Ąð”Ēð”Ŋ ð”Ķð”Ŧð”Ŧð”Ēð”Ŋð”Ēð”Ŧ 𝔉𝔞ð”ēð”Đð”ąð”Ķð”Ēð”Ŋð”Ē ð”Ēð”Ķð”Ŧ- ð”ēð”Ŧð”Ą 𝔞ð”ē𝔰𝔟ð”Đð”Ēð”Ŧð”Ąð”Ēð”ąð”Ē. 𝔇𝔞ð”Ŧð”Ŧ ð”Ēð”Ŋ𝔰𝔠ð”Ĩð”Ķð”Ēð”Ŧ ð”Ąð”Ēð”Ŋ ℌ𝔞ð”ēð”­ð”ąð”ąð”Ķð”ąð”Ēð”Đ. ℑ𝔠ð”Ĩ 𝔰𝔞ð”Ĩ 𝔰𝔎ð”Ģ𝔎ð”Ŋð”ą 𝔭ð”Ķð”Ŧð”Ļ 𝔞ð”Ŧ, 𝔞ð”Đ𝔰 𝔰ð”Ķð”Ē ð”Đ𝔞ð”Ŧð”Ī𝔰𝔞𝔊 ð”ēĖˆð”Ÿð”Ēð”Ŋ ð”Ąð”Ēð”Ŧ 𝔅ð”Ķð”Đð”Ąð”°ð” ð”Ĩð”Ķð”Ŋ𝔊 𝔰𝔠ð”Ĩð”īð”Ēð”Ÿð”ąð”Ē. 𝔒ð”Ĩ, ð”īð”Ķð”Ē ð”Ķ𝔠ð”Ĩ ð”īð”ēĖˆð”Ŧ𝔰𝔠ð”Ĩð”ąð”Ē, ð”Ķ𝔠ð”Ĩ ð”Ļ𝔎Ėˆð”Ŧð”Ŧð”ąð”Ē ð”Ąð”Ķð”Ē𝔰ð”Ē ð”ēĖˆð”­ð”­ð”Ķð”Īð”Ēð”Ŧ, ð”īð”Ēð”Ķ𝔠ð”Ĩð”Ēð”Ŧ 𝔄𝔰𝔰𝔠ð”Ĩð”Ēð”Ēð”Ļ𝔰 ð”Ģð”ēĖˆð”Ĩð”Đð”Ēð”Ŧ. 𝔓ð”Ķð”Ŧð”Ļ ð”Ķð”°ð”ą 𝔊ð”Ēð”Ķð”Ŧð”Ē 𝔎𝔎Ėˆð”Ŧð”Ķð”Īð”Ķð”Ŧ. 𝔇ð”Ķð”Ē ð”Ē𝔠ð”Ĩð”ąð”Ē 𝔉ð”Ŋ𝔞ð”ē ð”Ķð”Ŧ 𝔊ð”Ēð”Ķð”Ŧð”Ē𝔊 𝔏ð”Ē𝔟ð”Ēð”Ŧ. 𝔐ð”Ēð”Ķð”Ŧð”Ē 𝔉ð”Ŋ𝔞ð”ē ð”Ļ𝔎Ėˆð”Ŧð”Ŧð”ąð”Ē ð”Ŧð”Ķð”Ē𝔊𝔞ð”Đ𝔰 𝔰𝔎 𝔰ð”Ēð”ĩð”ķ 𝔰ð”Ēð”Ķð”Ŧ ð”īð”Ķð”Ē 𝔓ð”Ķð”Ŧð”Ļ; ℑð”Ĩð”Ŋð”Ē ð”Đð”Ēð”Ķ𝔰ð”Ēð”Ŧ ð”Ēð”Đð”Ēð”Ļð”ąð”Ŋð”Ķ𝔰𝔠ð”Ĩð”Ēð”Ŧ 𝔖𝔠ð”Ĩð”Ŋð”Ķð”ąð”ąð”Ē, 𝔞ð”Đ𝔰 ð”Ķ𝔠ð”Ĩ 𝔞ð”ē𝔰 ð”Ēð”Ķð”Ŧð”Ē𝔊 𝔄𝔟𝔷ð”ēð”Ī ð”Ĩð”Ēð”Ŋ𝔞ð”ē𝔰 𝔞ð”ēð”Ģ ð”Ķð”Ĩð”Ŋð”Ē ð”Ļð”ēð”Ŋð”ģð”Ķð”Īð”Ē 𝔊ð”Ēð”°ð”ąð”žð”Đð”ą 𝔰𝔠ð”Ĩ𝔞ð”ēð”Ē ð”ēð”Ŧð”Ą 𝔞ð”ēð”Ģ ð”Ąð”Ēð”Ŧ ð”Ŋð”Ķ𝔠ð”Ĩð”ąð”Ķð”Īð”Ēð”Ŧ â„Ļð”Ēð”Ķð”ąð”­ð”ēð”Ŧð”Ļð”ą ð”Ģð”ēĖˆð”Ŋ ð”Ēð”Ķð”Ŧð”Ēð”Ŧ 𝔖𝔠ð”Ĩð”Đ𝔞ð”Ī ð”ī𝔞ð”Ŋð”ąð”Ē. ℑ𝔠ð”Ĩ ð”Ļ𝔎ð”Ŧð”Ŧð”ąð”Ē 𝔓ð”Ķð”Ŧð”Ļ 𝔧ð”Ēð”Ąð”Žð” ð”Ĩ ð”Ŧð”Ķð”Ē ð”Ŧ𝔞ð”Ĩð”Ē ð”Ļ𝔎𝔊𝔊ð”Ēð”Ŧ, 𝔞ð”Đ𝔰 𝔎𝔟 𝔰ð”Ķð”Ē ð”Ēð”Ķð”Ŧð”Ēð”Ŧ 𝔰ð”Ē𝔠ð”Ĩð”°ð”ąð”Ēð”Ŧ 𝔖ð”Ķð”Ŧð”Ŧ ð”Ĩ𝔞Ėˆð”ąð”ąð”Ē, 𝔰ð”Ķð”Ē ð”īð”ēĖˆð”Ŋð”Ąð”Ē ð”Ķ𝔊𝔊ð”Ēð”Ŋ ð”Īð”Ēð”Ĩð”Ēð”Ŧ, 𝔟ð”Ēð”ģ𝔎ð”Ŋ ð”Ķ𝔠ð”Ĩ 𝔊ð”Ķ𝔠ð”Ĩ ð”Ķð”Ĩð”Ŋ 𝔞ð”Đ𝔰 𝔅ð”Ēð”ąð”Ŋð”ēĖˆð”Īð”Ēð”Ŋð”Ķð”Ŧ 𝔎ð”Ģð”Ģð”Ēð”Ŧ𝔟𝔞ð”Ŋð”Ēð”Ŧ ð”Ļ𝔎ð”Ŧð”Ŧð”ąð”Ē. ℑ𝔠ð”Ĩ ð”Ąð”Ŋð”ēĖˆð” ð”Ļð”Ē 𝔞ð”ēð”Ģ 𝔘Ėˆð”Ÿð”Ēð”Ŧ, ð”ē𝔊 𝔊ð”Ēð”Ķð”Ŧð”Ē 𝔉ð”Ķð”Ŧð”Īð”Ēð”Ŋ ð”ģ𝔎ð”Ŋ 𝔊ð”Ēð”Ķð”Ŧð”Ē𝔊 ð”Ēð”Ŋð”°ð”ąð”Ēð”Ŧ ð”Ķð”Ŧð”ąð”Ēð”Ŧ𝔰ð”Ķð”ģð”Ēð”Ŧ 𝔖𝔭ð”Ķð”Ēð”Đ ð”ēð”Ŧð”ąð”Ēð”Ŋ ð”ēð”Ŧ𝔰 𝔞ð”ēð”Ģ𝔷ð”ēð”ī𝔞Ėˆð”Ŋ𝔊ð”Ēð”Ŧ. ℑ𝔠ð”Ĩ ð”Ąð”Ŋð”ēĖˆð” ð”Ļð”Ē 𝔅ð”Đð”ēð”Ē ð”Ķð”Ŧ ℭ𝔎𝔊𝔊𝔰, ð”ēĖˆð”Ÿð”Ēð”Ŋð”Ūð”ēð”Ēð”Ŋð”Ē ð”Ąð”žð”Ŧð”Ŧ ð”Ąð”Ķð”Ē ℌ𝔞ð”Đð”Đð”Ē ð”ēð”Ŧð”Ą ð”Īð”Ēð”Ĩð”Ē 𝔷ð”ē 𝔖𝔭ð”Ē𝔠ð”Ķ𝔊ð”Ēð”Ŧ, ð”ē𝔊 𝔊ð”Ŋð”Ēð”Ēð”Ŧ ð”Ļ𝔞ð”Đð”ąð”Ÿð”Đð”ēĖˆð”ąð”Ķð”Ī 𝔷ð”ē ð”Ēð”Ŋ𝔊𝔎ð”Ŋð”Ąð”Ēð”Ŧ. 𝔇ð”Ēð”Ŋ 𝔑ð”Ēð”Ŋð”ģð”Ēð”Ŧð”Ļð”Ķð”ąð”·ð”Ēð”Đ, ð”Ēð”Ķð”Ŧð”Ēð”Ŧ 𝔞ð”Ŧð”Ķ𝔊ð”Ķð”Ēð”Ŋð”ąð”Ēð”Ŧ ℭð”Ĩ𝔞ð”Ŋ𝔞ð”Ļð”ąð”Ēð”Ŋ ð”Ķð”Ŧ ð”Ēð”Ķð”Ŧð”Ē𝔊 𝔒ð”Ŧð”Đð”Ķð”Ŧð”Ē-𝔖𝔭ð”Ķð”Ēð”Đ 𝔷ð”ē ð”ąð”ŽĖˆð”ąð”Ēð”Ŧ, ð”ī𝔞ð”Ŋ ð”Ŧ𝔎𝔠ð”Ĩ ð”Ŧð”Ķð”Ē 𝔰𝔎 𝔰𝔠ð”Ĩð”Ŧð”Ēð”Đð”Đ. ℑ𝔠ð”Ĩ ð”Īð”Ēð”Ĩð”Ē ð”Ąð”žð”Ŧð”Ŧ ð”Ķð”Ŧ ℜð”Ķ𝔠ð”Ĩð”ąð”ēð”Ŧð”Ī ℜð”Ē𝔞ð”Ļð”ąð”Žð”Ŋ, ð”°ð”ąð”Ē𝔠ð”Ĩð”Ē 𝔊ð”Ēð”Đ𝔟 ð”Ķð”Ŧ ð”Ąð”Ēð”Ŧ ℜð”ēĖˆð” ð”Ļð”Ēð”Ŧ ð”ēð”Ŧð”Ą ð”Ŋð”Ēð”Ŧð”Ŧð”Ē ð”Ąð”žð”Ŧð”Ŧ ð”Ąð”Ēð”Ŧ 𝔎𝔎ð”Ŋð”Ŋð”Ķð”Ąð”Žð”Ŋ ð”Ŧ𝔞𝔠ð”Ĩ ð”Ŋð”Ē𝔠ð”Ĩð”ąð”° ð”Ĩð”Ķð”Ŧð”ēð”Ŧð”ąð”Ēð”Ŋ, ð”ē𝔊 â„Ļð”ēð”Ī𝔞ð”Ŧð”Ī 𝔷ð”ēð”Ŋ 𝔇ð”Ēð”Ļ𝔎ð”Ŧð”ąð”žð”Šð”Ķð”Ŧð”žð”ąð”Ķ𝔎ð”Ŧ 𝔷ð”ē ð”Ēð”Ŋð”Ĩ𝔞ð”Đð”ąð”Ēð”Ŧ. ℑ𝔠ð”Ĩ 𝔟ð”Ēð”īð”Ēð”Īð”Ē 𝔊ð”Ķ𝔠ð”Ĩ ð”Đð”Ēð”Ķ𝔰ð”Ē ð”Ąð”ēð”Ŋ𝔠ð”Ĩ ð”Ąð”Ķð”Ē ℌ𝔞ð”Đð”Đð”Ēð”Ŧ, ð”īð”Ķð”Ē ð”Ēð”Ķð”Ŧð”Ē 𝔖𝔠ð”Ĩð”Đ𝔞ð”Ŧð”Īð”Ē, ð”Ąð”Ķð”Ē ð”Īð”Ēð”Ŋð”žð”Ąð”Ē ð”Ąð”žð”Ÿð”Ēð”Ķ ð”Ķð”°ð”ą, ð”Ķð”Ĩð”Ŋð”Ē 𝔅ð”Ēð”ēð”ąð”Ē 𝔷ð”ē 𝔰𝔠ð”Ĩð”Đ𝔞ð”Īð”Ēð”Ŧ, ð”ēð”Ŧð”Ą ð”Ķ𝔠ð”Ĩ 𝔰ð”Ēð”Ĩð”Ē - 𝔒ð”Ĩ ð”Ŧð”Ēð”Ķð”Ŧ. 𝔈𝔰 ð”Ķð”°ð”ą 𝔭ð”Ķð”Ŧð”Ļ. ℑ𝔠ð”Ĩ ð”°ð”ąð”Ēð”Ĩð”Ē ð”Ŋð”Ēð”Īð”ēð”Ŧð”Ī𝔰ð”Đ𝔎𝔰 ð”Ąð”ž ð”ēð”Ŧð”Ą 𝔰ð”Ēð”Ĩð”Ē 𝔰ð”Ķð”Ē ð”Ąð”Ķð”Ŋð”Ēð”Ļð”ą 𝔞ð”Ŧ. ℑð”Ĩð”Ŋ 𝔙ð”Ķ𝔰ð”Ķð”Ēð”Ŋ 𝔷ð”Ēð”Ķð”Īð”ą ð”Ļð”Ēð”Ķð”Ŧð”Ē ð”ˆð”Šð”Žð”ąð”Ķ𝔎ð”Ŧð”Ēð”Ŧ. 𝔄𝔟ð”Ēð”Ŋ 𝔰ð”Ķð”Ē ð”īð”Ēð”Ķß ð”Ē𝔰. ℑ𝔠ð”Ĩ ð”Ļ𝔞ð”Ŧð”Ŧ ð”Ē𝔰 ð”Ķð”Ŧ ð”Ąð”Ēð”Ŋ 𝔏ð”ēð”Ģð”ą ð”Ģð”ēĖˆð”Ĩð”Đð”Ēð”Ŧ. ℑ𝔠ð”Ĩ ð”Ļ𝔞ð”Ŧð”Ŧ 𝔰ð”Ķð”Ē ð”Ŧð”Ķ𝔠ð”Ĩð”ą ð”ąð”ŽĖˆð”ąð”Ēð”Ŧ. 𝔖ð”Ķð”Ē ð”Ķð”°ð”ą 𝔷ð”ē 𝔰𝔠ð”Ĩ𝔎Ėˆð”Ŧ, 𝔷ð”ē ð”Ēð”Ŧð”Īð”Ēð”Đð”Ĩ𝔞ð”Ģð”ą, ð”Ąð”žð”° 𝔏ð”Ķ𝔠ð”Ĩð”ą ð”īð”Ķð”Ŋð”Ą ð”ģ𝔎ð”Ŧ ð”Ķð”Ĩð”Ŋð”Ē𝔊 ð”Ŋ𝔎𝔰𝔞 ð”…ð”Žð”Ąð”ķ ð”Ŋð”Ēð”Ģð”Đð”Ēð”Ļð”ąð”Ķð”Ēð”Ŋð”ą, ð”īð”Ķð”Ē ð”–ð”ąð”Ēð”Ŋð”Ŧð”Ē 𝔞ð”Ŧ ð”Ēð”Ķð”Ŧð”Ē𝔊 ð”Đð”Ēð”Ēð”Ŋð”Ēð”Ŧ ℌð”Ķ𝔊𝔊ð”Ēð”Đ. 𝔖ð”Ķð”Ē ð”Ŋð”Ēð”Ŧð”Ŧð”ą ð”Ŧð”Ķ𝔠ð”Ĩð”ą. ℑ𝔠ð”Ĩ 𝔟ð”Ķð”Ŧ 𝔷ð”ē 𝔗ð”Ŋ𝔞Ėˆð”Ŧð”Ēð”Ŧ ð”Īð”Ēð”Ŋð”ēĖˆð”Ĩð”Ŋð”ą, 𝔞ð”Đ𝔰 ð”Ķ𝔠ð”Ĩ ð”Ąð”Ēð”Ŧ 𝔅ð”Ķð”Đð”Ąð”°ð” ð”Ĩð”Ķð”Ŋ𝔊 ð”°ð”ąð”Ŋð”Ēð”Ķ𝔠ð”Ĩð”Đð”Ē ð”ēð”Ŧð”Ą ð”Ķð”Ĩð”Ŧ 𝔷𝔞Ėˆð”Ŋð”ąð”Đð”Ķ𝔠ð”Ĩ ð”Ļð”ēĖˆð”°ð”°ð”Ē. \"𝔄ð”ēð”Ģ 𝔚ð”Ķð”Ēð”Ąð”Ēð”Ŋ𝔰ð”Ēð”Ĩð”Ēð”Ŧ, 𝔓ð”Ķð”Ŧð”Ļ. 𝔅ð”Ķ𝔰 𝔟𝔞ð”Đð”Ą. 𝔈𝔰 ð”īð”Ķð”Ŋð”Ą 𝔞ð”Đð”Đð”Ē𝔰 ð”Ķð”Ŧ 𝔒ð”Ŋð”Ąð”Ŧð”ēð”Ŧð”Ī 𝔰ð”Ēð”Ķð”Ŧ\", ð”Ģð”Đð”ēĖˆð”°ð”ąð”Ēð”Ŋð”Ē ð”Ķ𝔠ð”Ĩ 𝔊ð”Ķð”ą ð”Đð”Ēð”Ķ𝔰ð”Ēð”Ŋ, 𝔟ð”Ēð”Ŋð”ēð”Ĩð”Ķð”Īð”Ēð”Ŧð”Ąð”Ēð”Ŋ ð”–ð”ąð”Ķ𝔊𝔊ð”Ē. 𝔇𝔞ð”Ŧð”Ŧ 𝔷𝔎Ėˆð”Īð”Ēð”Ŋð”Ē ð”Ķ𝔠ð”Ĩ, ð”ī𝔞Ėˆð”Ĩð”Ŋð”Ēð”Ŧð”Ą 𝔊ð”Ēð”Ķð”Ŧ ℭð”ēð”Ŋ𝔰𝔎ð”Ŋ ð”ēĖˆð”Ÿð”Ēð”Ŋ ð”Ąð”Ē𝔊 𝔎ð”Ķð”Đð”Đ-𝔅ð”ēð”ąð”ąð”Žð”Ŧ 𝔰𝔠ð”Ĩð”īð”Ēð”Ÿð”ą. 𝔊ð”Ēð”Ąð”žð”Ŧð”Ļð”Ēð”Ŧ ð”Ąð”Ēð”Ŋ 𝔏ð”Ķð”Ē𝔟ð”Ē ð”Īð”Ēð”Ĩð”Ēð”Ŧ 𝔊ð”Ķð”Ŋ ð”Ąð”ēð”Ŋ𝔠ð”Ĩ ð”Ąð”Ēð”Ŧ 𝔎𝔎𝔭ð”Ģ. â„œð”Žð”ą 𝔊ð”Ķð”ą ð”Ŋ𝔎Ėˆð”ąð”Đð”Ķ𝔠ð”Ĩ-ð”Ŋ𝔎𝔰𝔞 ð”ģð”Ēð”Ŋð”Ąð”žĖˆð” ð”Ĩð”ąð”Ķð”Īð”Ēð”Ŧ 𝔎ð”Ķð”Ŧð”Ąð”Ēð”Ŋð”Ŧ 𝔊ð”Ķð”ą ℜ𝔎𝔰𝔞. 𝔄𝔟ð”Ēð”Ŋ ð”Ķ𝔠ð”Ĩ 𝔊ð”ē𝔰𝔰. 𝔄ð”Đ𝔰 𝔅ð”Ēð”ąð”Ŋð”ēĖˆð”Īð”Ēð”Ŋ ð”Ķð”°ð”ą ð”Ē𝔰 𝔊ð”Ēð”Ķð”Ŧð”Ē 𝔓ð”Ģð”Đð”Ķ𝔠ð”Ĩð”ą 𝔷ð”ē ð”ąð”ŽĖˆð”ąð”Ēð”Ŧ. ℑ𝔠ð”Ĩ ð”Ąð”Ŋð”ēĖˆð” ð”Ļð”Ē ð”Ąð”Ēð”Ŧ '𝔎ð”Ķð”Đð”Đ'-𝔎ð”Ŧ𝔎𝔭ð”Ģ ð”ēð”Ŧð”Ą 𝔟ð”Ē𝔎𝔟𝔞𝔠ð”Ĩð”ąð”Ē, ð”īð”Ķð”Ē 𝔊ð”Ēð”Ķð”Ŧ ℭð”Ĩ𝔞ð”Ŋ𝔞ð”Ļð”ąð”Ēð”Ŋ 𝔓ð”Ķð”Ŧð”Ļ ð”Đ𝔞ð”ēð”ąð”Đ𝔎𝔰 ð”Ēð”Ŧð”ąð”Ĩ𝔞ð”ēð”­ð”ąð”Ēð”ą. ℑ𝔠ð”Ĩ ð”Ĩ𝔎Ėˆð”Ŋð”Ē ð”Ŧð”ēð”Ŋ ð”Ąð”Ēð”Ŧ 𝔅ð”Đð”ēð”ąð”°ð”ąð”Ŋ𝔞ð”Ĩð”Đ. 𝔎ð”Ēð”Ķð”Ŧð”Ē 𝔈ð”Ķð”Đð”Ē. 𝔈𝔰 ð”Īð”Ķð”Ÿð”ą ð”Ŧð”ēð”Ŋ ℜð”Ēð”Ą, ð”Ąð”Ēð”Ŋ 𝔞ð”Đð”Đð”Ēð”Ķð”Ŧð”Ē ð”Ķð”Ŧ 𝔉ð”ēð”Ēð”Đ ð”°ð”ąð”Ēð”Ĩð”ą. ℜ𝔎𝔰𝔞𝔰 ð”Đð”Ē𝔟ð”Đ𝔎𝔰ð”Ēð”Ŋ 𝔎𝔎Ėˆð”Ŋ𝔭ð”Ēð”Ŋ ð”Đ𝔞ð”Ī ð”Ŧð”Ē𝔟ð”Ēð”Ŧ ð”Ķð”Ĩ𝔊 𝔞ð”ēð”Ģ ð”Ąð”Ē𝔊 ð”…ð”Žð”Ąð”Ēð”Ŧ. ℑ𝔠ð”Ĩ ð”Ģð”ēĖˆð”Ĩð”Đð”Ē 𝔷ð”ēð”Ēð”Ŋð”°ð”ą ð”Ŧð”Ķ𝔠ð”Ĩð”ąð”°, ð”Ąð”žð”Ŧð”Ŧ ð”ēð”Ŧð”Ēð”Ŋ𝔊ð”Ē𝔰𝔰ð”Đð”Ķ𝔠ð”Ĩð”Ē 𝔗ð”Ŋ𝔞ð”ēð”Ŋð”Ķð”Īð”Ļð”Ēð”Ķð”ą, 𝔞ð”Đ𝔰 ð”ī𝔞Ėˆð”Ŋð”Ē ð”Ķ𝔠ð”Ĩ 𝔟ð”Ēð”Ķ ð”Ąð”Ēð”Ŋ 𝔅ð”Ēð”Ēð”Ŋð”Ąð”Ķð”Īð”ēð”Ŧð”Ī ð”Ēð”Ķð”Ŧð”Ē𝔰 ð”Īð”Ēð”Đð”Ķð”Ēð”Ÿð”ąð”Ēð”Ŧ 𝔐ð”Ēð”Ŧ𝔰𝔠ð”Ĩð”Ēð”Ŧ. 𝔐ð”Ēð”Ķð”Ŧ 𝔖𝔎ð”Ĩð”Ŧ ð”Ļð”Đ𝔎𝔭ð”Ģð”ą 𝔞ð”Ŧ ð”Ąð”Ķð”Ē 𝔗ð”ēĖˆð”Ŋ ð”ēð”Ŧð”Ą ð”ēð”Ŧð”ąð”Ēð”Ŋ𝔟ð”Ŋð”Ķ𝔠ð”Ĩð”ą 𝔊ð”Ēð”Ķð”Ŧð”Ēð”Ŧ ð”Ļð”ēð”Ŋ𝔷ð”Ēð”Ŧ 𝔐𝔎𝔊ð”Ēð”Ŧð”ą ð”Ąð”Ēð”Ŋ 𝔗ð”Ŋ𝔞ð”ēð”Ēð”Ŋ. 𝔈ð”Ŋ ð”Ģð”Ŋ𝔞ð”Īð”ą: \"ð”‡ð”žð”Ą? 𝔚ð”Ķð”Ŋð”°ð”ą ð”Ąð”ē 𝔊ð”Ķð”Ŋ ð”Ēð”Ķð”Ŧð”Ēð”Ŧ 𝔖ð”Ŧ𝔞𝔠ð”Ļ 𝔊𝔞𝔠ð”Ĩð”Ēð”Ŧ?\" ℑ𝔠ð”Ĩ 𝔰𝔞ð”Īð”Ē ð”Ķð”Ĩ𝔊, ð”Ēð”Ŋ 𝔰𝔎ð”Đð”Đ ð”Ąð”Ķð”Ē 𝔎ð”Đ𝔞𝔭𝔭ð”Ē ð”Ĩ𝔞ð”Đð”ąð”Ēð”Ŧ, ð”ēð”Ŧð”Ą 𝔊ð”Ēð”Ķð”Ŧð”Ē ð”–ð”ąð”Ķ𝔊𝔊ð”Ē 𝔟ð”Ŋð”Ķ𝔠ð”Ĩð”ą. ℑ𝔠ð”Ĩ 𝔟ð”Ŋð”Ē𝔠ð”Ĩð”Ē 𝔰𝔠ð”Ĩð”Đð”ē𝔠ð”Ĩ𝔷ð”Ēð”Ŧð”Ą 𝔷ð”ē𝔰𝔞𝔊𝔊ð”Ēð”Ŧ. ℑ𝔠ð”Ĩ ð”Ĩ𝔞𝔟ð”Ē 𝔰ð”Ķð”Ē ð”Īð”Ēð”ąð”ŽĖˆð”ąð”Ēð”ą. ℑ𝔠ð”Ĩ ð”Ĩ𝔞𝔟ð”Ē 𝔊ð”Ēð”Ķð”Ŧð”Ē ð”Ēð”Ķð”Ŧ𝔷ð”Ķð”Ī ð”ī𝔞ð”Ĩð”Ŋð”Ē 𝔏ð”Ķð”Ē𝔟ð”Ē ð”Īð”Ēð”ąð”ŽĖˆð”ąð”Ēð”ą. ð”Šð”Žð”ąð”ą ð”ģð”Ēð”Ŋð”Īð”Ķ𝔟 𝔊ð”Ķð”Ŋ. ℑ𝔠ð”Ĩ 𝔎Ėˆð”Ģð”Ģð”Ŧð”Ē 𝔊ð”Ēð”Ķð”Ŧð”Ē𝔊 𝔖𝔎ð”Ĩð”Ŧ ð”Ąð”Ķð”Ē 𝔗ð”ēĖˆð”Ŋ ð”ēð”Ŧð”Ą ð”Ēð”Ŋ ð”Ĩð”žð”ą ð”Ēð”Ķð”Ŧð”Ēð”Ŧ ð”ģð”Ēð”Ŋð”īð”Ķð”Ŋð”Ŋð”ąð”Ēð”Ŧ 𝔊ð”Ē𝔰ð”Ķ𝔠ð”Ĩð”ąð”°ð”žð”ēð”°ð”Ąð”Ŋð”ē𝔠ð”Ļ. ℑ𝔠ð”Ĩ 𝔰𝔞ð”Īð”Ē ð”Ŧð”Ķ𝔠ð”Ĩð”ąð”° ð”ēð”Ŧð”Ą ð”Īð”Ēð”Ĩð”Ē ð”Ķð”Ŧ ð”Ąð”Ķð”Ē 𝔎ð”ēĖˆð” ð”Ĩð”Ē, ð”ē𝔊 ð”Ķð”Ĩ𝔊 ð”Ēð”Ķð”Ŧ 𝔖𝔞ð”Ŧð”Ąð”īð”Ķ𝔠ð”Ĩ 𝔷ð”ē 𝔊𝔞𝔠ð”Ĩð”Ēð”Ŧ. 𝔗ð”Ŋ𝔞Ėˆð”Ŧð”Ēð”Ŧ ð”Ŋ𝔎ð”Đð”Đð”Ēð”Ŧ ð”ģ𝔎ð”Ŧ 𝔊ð”Ēð”Ķð”Ŧð”Ē𝔊 𝔊ð”Ē𝔰ð”Ķ𝔠ð”Ĩð”ą ð”Ķð”Ŧ𝔰 𝔅ð”Ŋð”Žð”ą, 𝔞ð”Đ𝔰 ð”Ķ𝔠ð”Ĩ ð”Ē𝔰 𝔞ð”ēð”Ģ ð”Ąð”Ķð”Ē 𝔗ð”Ĩð”Ēð”Ļð”Ē ð”Đð”Ēð”Īð”Ē. 𝔖𝔞ð”Đð”žð”ą, 𝔎𝔞Ėˆð”°ð”Ē ð”ēð”Ŧð”Ą 𝔉ð”Đð”Ēð”Ķ𝔰𝔠ð”Ĩ, ð”Īð”Ēð”Ģ𝔎ð”Đð”Īð”ą ð”ģ𝔎ð”Ŧ ð”Ēð”Ķð”Ŧð”Ē𝔊 ð”ąð”Ŋ𝔞ð”ēð”Ŋð”Ķð”Īð”Ēð”Ŧ 𝔚ð”Ķð”Ŋ𝔟ð”Ēð”Đ 𝔞ð”ē𝔰 𝔖ð”Ēð”Ŧð”Ģ. 𝔐ð”Ēð”Ķð”Ŧ 𝔖𝔎ð”Ĩð”Ŧ ð”Ķð”°ð”ą ð”°ð”ąð”Ķð”Đð”Đ. 𝔈ð”Ŋ 𝔰ð”Ķð”ąð”·ð”ą 𝔞ð”ēð”Ģ ð”Ąð”Ēð”Ŋ ℭ𝔎ð”ē𝔠ð”Ĩ ð”ēð”Ŧð”Ą ð”°ð”ąð”žð”Ŋð”Ŋð”ą 𝔞ð”ēð”Ģ ð”Ąð”Ēð”Ŧ ð”…ð”Žð”Ąð”Ēð”Ŧ. 𝔈𝔰 ð”Ķð”°ð”ą ð”Ēð”Ķð”Ŧð”Ē ð”Ąð”Ē𝔭ð”Ŋð”Ķ𝔊ð”Ķð”Ēð”Ŋð”Ēð”Ŧð”Ąð”Ē 𝔏ð”ēð”Ģð”ą ð”ē𝔊 ð”ēð”Ŧ𝔰 ð”Ĩð”Ēð”Ŋð”ē𝔊. ℑ𝔠ð”Ĩ 𝔰ð”Ēð”Ŋð”ģð”Ķð”Ēð”Ŋð”Ē ð”Ķð”Ĩ𝔊 ð”Ąð”žð”° 𝔖𝔞ð”Ŧð”Ąð”īð”Ķ𝔠ð”Ĩ ð”ēð”Ŧð”Ą ð”Īð”Ēð”Ĩð”Ē 𝔷ð”ēð”Ŋð”ēĖˆð” ð”Ļ ð”Ķð”Ŧ 𝔊ð”Ēð”Ķð”Ŧ â„Ļð”Ķ𝔊𝔊ð”Ēð”Ŋ, ð”ē𝔊 ð”ēĖˆð”Ÿð”Ēð”Ŋ ð”Ąð”žð”° 𝔏ð”Ē𝔟ð”Ēð”Ŧ ð”Ŧ𝔞𝔠ð”Ĩ𝔷ð”ēð”Ąð”Ēð”Ŧð”Ļð”Ēð”Ŧ. 𝔚ð”Ēð”Ŧð”Ŧ ð”Ķ𝔠ð”Ĩ 𝔓ð”Ķð”Ŧð”Ļ ð”Īð”Ēð”ąð”ŽĖˆð”ąð”Ēð”ą ð”Ĩ𝔞𝔟ð”Ē, ð”īð”Ķð”Ē ð”Ļ𝔞ð”Ŧð”Ŧ ð”Ķ𝔠ð”Ĩ 𝔊ð”Ēð”Ķð”Ŧð”Ēð”Ŋ 𝔉𝔞𝔊ð”Ķð”Đð”Ķð”Ē ð”ģð”Ēð”Ŋð”ąð”Ŋ𝔞ð”ēð”Ēð”Ŧ? ℑ𝔠ð”Ĩ ð”īð”Ēð”Ķð”Ŧð”Ē ð”°ð”ąð”ēð”Ŧð”Ąð”Ēð”Ŧð”Đ𝔞ð”Ŧð”Ī ð”ēð”Ŧð”Ą 𝔰𝔠ð”Ĩð”Đð”Ķð”Ēßð”Đð”Ķ𝔠ð”Ĩ ð”Ļð”Žð”Šð”Šð”ą 𝔊ð”Ēð”Ķð”Ŧð”Ē 𝔉ð”Ŋ𝔞ð”ē 𝔷ð”ēð”Ŋð”ēĖˆð” ð”Ļ. 𝔖ð”Ķð”Ē 𝔰ð”Ķð”Ēð”Ĩð”ą 𝔊ð”Ķ𝔠ð”Ĩ 𝔞ð”ēð”Ģ ð”Ąð”Ē𝔊 𝔅ð”Ēð”ąð”ą 𝔟ð”Ŋð”ēĖˆð”Đð”Đð”Ēð”Ŧ ð”īð”Ķð”Ē ð”Ēð”Ķð”Ŧ 𝔎ð”Ķð”Ŧð”Ą, ð”Ąð”žð”° 𝔰ð”Ēð”Ķð”Ŧ 𝔈ð”Ķ𝔰 ð”Ģ𝔞ð”Đð”Đð”Ēð”Ŧ ð”Đð”Ķð”Ēß. 𝔖ð”Ķð”Ē ð”Ģð”Ŋ𝔞ð”Īð”ą 𝔊ð”Ķ𝔠ð”Ĩ ð”Ąð”žð”Ŧð”Ŧ, ð”ī𝔞ð”Ŋð”ē𝔊 ð”Ķ𝔠ð”Ĩ ð”īð”Ēð”Ķð”Ŧð”Ē ð”ēð”Ŧð”Ą 𝔊ð”ēð”Ŋ𝔊ð”Đð”Ē: \"ℑ𝔠ð”Ĩ ð”Ĩ𝔞𝔟ð”Ē 𝔰ð”Ķð”Ē ð”Īð”Ēð”ąð”ŽĖˆð”ąð”Ēð”ą. ℑ𝔠ð”Ĩ ð”Ĩ𝔞𝔟ð”Ē 𝔊ð”Ēð”Ķð”Ŧð”Ē ð”Ēð”Ķð”Ŧ𝔷ð”Ķð”Īð”Ē 𝔏ð”Ķð”Ē𝔟ð”Ē, 𝔓ð”Ķð”Ŧð”Ļ, ð”ēð”Ŧð”ąð”Ēð”Ŋ ð”ēð”Ŧ𝔰 ð”Īð”Ēð”ąð”ŽĖˆð”ąð”Ēð”ą.\" 𝔖ð”Ķð”Ē ð”Ķð”°ð”ą ð”ģ𝔎ð”Đð”Đð”Ēð”Ŋ 𝔚ð”ēð”ą ð”ēð”Ŧð”Ą 𝔰𝔠ð”Ĩð”Đ𝔞Ėˆð”Īð”ą 𝔊ð”Ķð”Ŋ ð”Ķð”Ŧ𝔰 𝔊ð”Ē𝔰ð”Ķ𝔠ð”Ĩð”ą. ℑ𝔠ð”Ĩ ð”Ģð”ēĖˆð”Ĩð”Đð”Ē 𝔊ð”Ķ𝔠ð”Ĩ 𝔟ð”Ēð”Ŧ𝔎𝔊𝔊ð”Ēð”Ŧ. 𝔖ð”Ķð”Ē 𝔟ð”Ķð”ąð”ąð”Ēð”ą ð”ē𝔊 𝔖𝔠ð”Ĩð”Ēð”Ķð”Ąð”ēð”Ŧð”Ī. ℑ𝔠ð”Ĩ 𝔞ð”Ŧð”ąð”ī𝔎ð”Ŋð”ąð”Ē ð”Ŧð”Ķ𝔠ð”Ĩð”ą. ð”–ð”ąð”žð”ąð”ąð”Ąð”Ē𝔰𝔰ð”Ēð”Ŧ ð”Ŧð”Ēð”Ĩ𝔊ð”Ē ð”Ķ𝔠ð”Ĩ 𝔊ð”Ēð”Ķð”Ŧð”Ēð”Ŧ ð”ð”žð”­ð”ąð”Žð”­, ð”°ð”ąð”Ēð”Ķð”Īð”Ē ð”Ķð”Ŧ 𝔊ð”Ēð”Ķð”Ŧ 𝔄ð”ēð”ąð”Ž ð”ēð”Ŧð”Ą ð”Ģ𝔞ð”Ĩð”Ŋð”Ē 𝔷ð”ē ð”Ēð”Ķð”Ŧð”Ē𝔊 ð”Ŧ𝔞ð”Ĩð”Ē ð”Īð”Ēð”Đð”Ēð”Īð”Ēð”Ŧð”Ēð”Ŧ â„Œð”Žð”ąð”Ēð”Đ. 𝔖𝔠ð”Ĩð”Ŧð”Ēð”Đð”Đð”Ēð”Ŋ 𝔙𝔎ð”Ŋð”Đ𝔞ð”ēð”Ģ ð”Ēð”Ķð”Ŧð”Ķð”Īð”Ē 𝔐𝔎ð”Ŧð”žð”ąð”Ē 𝔟ð”Ķ𝔰 𝔷ð”ēð”Ŋ 𝔖𝔠ð”Ĩð”Ēð”Ķð”Ąð”ēð”Ŧð”Ī. 𝔈𝔰 ð”ī𝔞ð”Ŋ 𝔰𝔠ð”Ĩð”Ŧð”Ēð”Đð”Đ ð”ēð”Ŧð”Ą 𝔰𝔠ð”Ĩ𝔊ð”Ēð”Ŋ𝔷ð”Đ𝔎𝔰. 𝔑𝔞𝔠ð”Ĩ ð”Ąð”Ē𝔊 𝔊ð”Ēð”Ŋð”Ķ𝔠ð”Ĩð”ą 𝔟ð”Ķð”ąð”ąð”Ē ð”Ķ𝔠ð”Ĩ 𝔊ð”Ēð”Ķð”Ŧð”Ē ð”Ģð”Ŋð”ēĖˆð”Ĩð”Ēð”Ŋð”Ē 𝔉ð”Ŋ𝔞ð”ē, 𝔊ð”Ķ𝔠ð”Ĩ 𝔷ð”ēð”Ŋð”ēĖˆð” ð”Ļ𝔷ð”ēð”Ŧð”Ēð”Ĩ𝔊ð”Ēð”Ŧ. \"ℑ𝔠ð”Ĩ ð”Ļ𝔞ð”Ŧð”Ŧ ð”Ąð”Ķ𝔠ð”Ĩ ð”Ŧð”Ķ𝔠ð”Ĩð”ą 𝔷ð”ēð”Ŋð”ēĖˆð” ð”Ļð”Ŧð”Ēð”Ĩ𝔊ð”Ēð”Ŧ. 𝔇ð”ē ð”ī𝔞ð”Ŋð”°ð”ą ð”Ķ𝔊𝔊ð”Ēð”Ŋ 𝔰𝔎. ℑ𝔠ð”Ĩ ð”ī𝔞ð”Ŋ ð”Ąð”Ķð”Ŋ ð”ģ𝔎ð”Ŧ 𝔄ð”Ŧð”Ģ𝔞ð”Ŧð”Ī 𝔞ð”Ŧ 𝔊ð”Ķð”°ð”°ð”ąð”Ŋ𝔞ð”ēð”Ķ𝔰𝔠ð”Ĩ." + +// 1/n change to return true +fn random(min int max int) { + run_command("fish" ["-c" "random " + min.to_string() + " " + max.to_string() ...]).assume_no_enum().1.trim().parse_int().assume1() +} +fn rnd() random(5 15) + +words = rnd() +for word text.regex("\\S+").assume_no_enum() + if words > 0 { + print(word + " ") + words = words - 1 + } else if words == 0 { + println(word) + words = rnd() + sleep(0.75) + } +println(" ~ ~ ~ ~ ~ ~ ~ ~ ~ ~") diff --git a/get_ref.mers b/get_ref.mers index a3801ac..f184436 100644 --- a/get_ref.mers +++ b/get_ref.mers @@ -1,8 +1,10 @@ list = [1 2 3 4 5 6 7 8 9 ...] -second = &list.get_ref(2).assume1() -second.debug() -*second = 24 -second.debug() +// second = &list.get_ref(2).assume1() +// second.debug() +// *second = 24 +// second.debug() + +&list.get_ref(2).assume1() = 24 list.debug() diff --git a/http.mers b/http.mers index 7c3c78a..954b6cf 100644 --- a/http.mers +++ b/http.mers @@ -12,6 +12,6 @@ sleep(0.5) http_get("https:\//github.com/").assume_no_enum() println("got github start page as html") -// t.await() +t.await() http_get("not a url").debug() diff --git a/iterators.mers b/iterators.mers index 3472508..ff4d2af 100755 --- a/iterators.mers +++ b/iterators.mers @@ -19,3 +19,21 @@ fn map_string_to_int(list [string ...] func fn((string int))) { for v ["1" "2" "5" "-10" ...].map_string_to_int((s string) s.parse_int().assume1("list contained strings that can't be parsed to an int!")) { debug(v) } + + +// returns an iterator to iteratively compute square numbers +// using the fact that (n+1)^2 = n^2 + 2n + 1 +fn square_numbers() { + i = 0 + val = 0 + () { + val = val + { 2 * i } + 1 + i = i + 1 + [val] + } +} + +for n square_numbers() { + println(n.to_string()) + n >= 100 +} diff --git a/mers/a.mers b/mers/a.mers new file mode 100644 index 0000000..0edeae7 --- /dev/null +++ b/mers/a.mers @@ -0,0 +1,4 @@ +a = 1 +b = 2 +a.debug() +b.debug() diff --git a/mers/src/main.rs b/mers/src/main.rs index b3fd4da..6b933b2 100755 --- a/mers/src/main.rs +++ b/mers/src/main.rs @@ -128,6 +128,8 @@ fn normal_main() { }; match parsing::parse::parse(&mut file) { Ok(script) => { + #[cfg(debug_assertions)] + eprintln!("{script:#?}"); println!(" - - - - -"); let start = Instant::now(); let out = script.run(std::env::args().skip(2).collect()); diff --git a/mers/src/nushell_plugin.rs b/mers/src/nushell_plugin.rs index 07b50a2..57b5cbb 100755 --- a/mers/src/nushell_plugin.rs +++ b/mers/src/nushell_plugin.rs @@ -120,10 +120,7 @@ impl Plugin for MersNuPlugin { } Err(e) => Value::Error { error: Box::new(ShellError::IncorrectValue { - msg: format!( - "Couldn't compile mers, error: {}", - e.with_file(&file) - ), + msg: format!("Couldn't compile mers, error: {}", e.with_file(&file)), span: source_span, }), }, diff --git a/mers/src/parsing/parse.rs b/mers/src/parsing/parse.rs index f5cb11f..6e7f822 100755 --- a/mers/src/parsing/parse.rs +++ b/mers/src/parsing/parse.rs @@ -148,6 +148,9 @@ pub fn parse(file: &mut File) -> Result { Err(e) => return Err((e.into(), ginfo.to_arc()).into()), }; + #[cfg(debug_assertions)] + eprintln!("{func:#?}"); + ginfo.libs = match parse_step_libs_load(libs, &mut ginfo) { Ok(v) => v, Err(e) => return Err((e.into(), ginfo.to_arc()).into()), @@ -533,11 +536,12 @@ pub mod implementation { } pub(crate) fn parse_statement(file: &mut File) -> Result { - parse_statement_adv(file, false) + parse_statement_adv(file, false, 0) } pub(crate) fn parse_statement_adv( file: &mut File, is_part_of_chain_already: bool, + chain_level: usize, ) -> Result { file.skip_whitespaces(); let err_start_of_statement = *file.get_pos(); @@ -589,37 +593,6 @@ pub mod implementation { }; match nchar { Some(':') => { - let file_pos_before_pot_type = *file.get_pos(); - let parsed_type = parse_type(file); - file.skip_whitespaces(); - if let Some('=') = file.next() { - let err_equals_sign = *file.get_pos(); - let start = start.trim(); - let derefs = start.chars().take_while(|c| *c == '*').count(); - match parse_statement(file) { - Ok(v) => break v - .output_to(start[derefs..].to_owned(), derefs) - .force_output_type(Some(match parsed_type { - Ok(v) => v, - Err(mut e) => { - e.context.push(( - format!("interpreted this as an assignment to a variable with the format :: = "), Some((err_start_of_statement, Some(err_equals_sign))) - )); - return Err(e); - } - })), - Err(mut e) => { - e.context.push(( - format!( - "statement was supposed to be assigned to variable {start}" - ), - Some((err_start_of_statement, Some(err_equals_sign))), - )); - return Err(e); - } - } - } - file.set_pos(file_pos_before_pot_type); return Ok(SStatement::new(SStatementEnum::EnumVariant( start, parse_statement(file)?, @@ -636,25 +609,6 @@ pub mod implementation { }); } file.skip_whitespaces(); - // var = statement - if let Some('=') = file.peek() { - file.next(); - let err_equals_sign = *file.get_pos(); - let start = start.trim(); - let derefs = start.chars().take_while(|c| *c == '*').count(); - match parse_statement(file) { - Ok(v) => break v.output_to(start[derefs..].to_owned(), derefs), - Err(mut e) => { - e.context.push(( - format!( - "statement was supposed to be assigned to variable {start}" - ), - Some((err_start_of_statement, Some(err_equals_sign))), - )); - return Err(e); - } - }; - } // parse normal statement let start = start.trim(); match start { @@ -889,23 +843,21 @@ pub mod implementation { } }; let err_end_of_original_statement = *file.get_pos(); - file.skip_whitespaces(); - if !file[file.get_pos().current_char_index..].starts_with("..") { - // dot chain syntax only works if there is only one dot - if let Some('.') = file.peek() { - // consume the dot (otherwise, a.b.c syntax will break in certain cases) - file.next(); - } - if !is_part_of_chain_already { - let mut chain_length = 0; - let mut err_end_of_prev = err_end_of_original_statement; - while let Some('.') = - file.get_char(file.get_pos().current_char_index.saturating_sub(1)) + // special characters that can follow a statement (loop because these can be chained) + loop { + file.skip_whitespaces(); + out = match (chain_level, file.peek()) { + (0..=200, Some('.')) + if !matches!( + file.get_char(file.get_pos().current_char_index + 1), + Some('.') + ) => { + file.next(); let err_start_of_wrapper = *file.get_pos(); - let wrapper = parse_statement_adv(file, true)?; + let wrapper = parse_statement_adv(file, true, 250)?; let err_end_of_wrapper = *file.get_pos(); - out = match *wrapper.statement { + match *wrapper.statement { SStatementEnum::FunctionCall(func, args) => { let args = [out].into_iter().chain(args.into_iter()).collect(); SStatementEnum::FunctionCall(func, args).to() @@ -913,67 +865,131 @@ pub mod implementation { SStatementEnum::Value(vd) => match &vd.data().0 { VDataEnum::Int(i) => SStatementEnum::IndexFixed(out, *i as _).to(), _ => { - let mut context = vec![]; - if chain_length > 0 { - context.push(( - format!( - "this is the {} wrapping statement in a chain.", - match chain_length { - 1 => format!("second"), - 2 => format!("third"), - // NOTE: this technically breaks at 21, but I don't care. - len => format!("{}th", len + 1), - } - ), - None, - )); - } - context.push(( - format!("the statement that was supposed to be wrapped"), - Some((err_start_of_statement, Some(err_end_of_prev))), - )); return Err(ParseError { err: ParseErrors::CannotUseFixedIndexingWithThisType(vd.out()), location: err_start_of_wrapper, location_end: Some(err_end_of_wrapper), - context, + context: vec![( + format!("this is a wrapping statement (a.f(), a.0, etc.).",), + None, + )], info: None, }); } }, other => { - let mut context = vec![]; - if chain_length > 0 { - context.push(( - format!( - "this is the {} wrapping statement in a chain.", - match chain_length { - 1 => format!("second"), - 2 => format!("third"), - // NOTE: this technically breaks at 21, but I don't care. - len => format!("{}th", len + 1), - } - ), - None, - )); - } - context.push(( - format!("the statement that was supposed to be wrapped"), - Some((err_start_of_statement, Some(err_end_of_prev))), - )); return Err(ParseError { err: ParseErrors::CannotWrapWithThisStatement(other), location: err_start_of_wrapper, location_end: Some(err_end_of_wrapper), - context, + context: vec![( + format!("this is a wrapping statement (a.f(), a.0, etc.).",), + None, + )], info: None, }); } - }; - err_end_of_prev = err_end_of_wrapper; - chain_length += 1; + } } - } + (0..=100, Some('+')) => { + file.next(); + SStatementEnum::FunctionCall( + "add".to_owned(), + // AMONG + vec![out, parse_statement_adv(file, true, 100)?], + ) + .to() + } + (0..=100, Some('-')) => { + file.next(); + SStatementEnum::FunctionCall( + "sub".to_owned(), + // US + vec![out, parse_statement_adv(file, true, 100)?], + ) + .to() + } + (0..=100, Some('*')) => { + file.next(); + SStatementEnum::FunctionCall( + "mul".to_owned(), + vec![out, parse_statement_adv(file, true, 100)?], + ) + .to() + } + (0..=100, Some('/')) => { + file.next(); + SStatementEnum::FunctionCall( + "div".to_owned(), + // RED SUSSY MOGUS MAN + vec![out, parse_statement_adv(file, true, 100)?], + ) + .to() + } + (0..=100, Some('%')) => { + file.next(); + SStatementEnum::FunctionCall( + "mod".to_owned(), + vec![out, parse_statement_adv(file, true, 100)?], + ) + .to() + } + (0..=50, Some('>')) => { + file.next(); + SStatementEnum::FunctionCall( + if let Some('=') = file.peek() { + file.next(); + "gtoe".to_owned() + } else { + "gt".to_owned() + }, + vec![out, parse_statement_adv(file, true, 50)?], + ) + .to() + } + (0..=50, Some('<')) => { + file.next(); + SStatementEnum::FunctionCall( + if let Some('=') = file.peek() { + file.next(); + "ltoe".to_owned() + } else { + "lt".to_owned() + }, + vec![out, parse_statement_adv(file, true, 50)?], + ) + .to() + } + (0..=50, Some('=')) + if matches!( + file.get_char(file.get_pos().current_char_index + 1), + Some('=') + ) => + { + file.next(); + file.next(); + SStatementEnum::FunctionCall( + "eq".to_owned(), + vec![out, parse_statement_adv(file, true, 50)?], + ) + .to() + } + (0..=10, Some('=')) => { + file.next(); + match out.statement.as_mut() { + SStatementEnum::Variable(name, r) => { + if name.starts_with("*") { + *name = name[1..].to_owned(); + } else { + *r = true + } + } + _ => {} + } + parse_statement(file)?.output_to(out, 0) + } + _ => break, + }; } Ok(out) } diff --git a/mers/src/script/code_macro.rs b/mers/src/script/code_macro.rs index d0889ba..3c940f3 100755 --- a/mers/src/script/code_macro.rs +++ b/mers/src/script/code_macro.rs @@ -63,6 +63,7 @@ fn parse_mers_code(file: &mut File) -> Result { } } +#[derive(Debug)] pub enum Macro { /// Compiles and executes the provided mers code at compile-time and inserts the value StaticMers(VData), diff --git a/mers/src/script/code_parsed.rs b/mers/src/script/code_parsed.rs index 33fc065..eb2f66e 100755 --- a/mers/src/script/code_parsed.rs +++ b/mers/src/script/code_parsed.rs @@ -2,6 +2,7 @@ use std::fmt::{self, Display, Formatter, Pointer}; use super::{code_macro::Macro, global_info::GlobalScriptInfo, val_data::VData, val_type::VType}; +#[derive(Debug)] pub enum SStatementEnum { Value(VData), Tuple(Vec), @@ -30,8 +31,9 @@ impl SStatementEnum { } } +#[derive(Debug)] pub struct SStatement { - pub output_to: Option<(String, usize)>, + pub output_to: Option<(Box, usize)>, pub statement: Box, pub force_output_type: Option, } @@ -44,8 +46,8 @@ impl SStatement { force_output_type: None, } } - pub fn output_to(mut self, var: String, derefs: usize) -> Self { - self.output_to = Some((var, derefs)); + pub fn output_to(mut self, statement: SStatement, derefs: usize) -> Self { + self.output_to = Some((Box::new(statement), derefs)); self } // forces the statement's output to fit in a certain type. @@ -56,6 +58,7 @@ impl SStatement { } /// A block of code is a collection of statements. +#[derive(Debug)] pub struct SBlock { pub statements: Vec, } @@ -66,6 +69,7 @@ impl SBlock { } // A function is a block of code that starts with some local variables as inputs and returns some value as its output. The last statement in the block will be the output. +#[derive(Debug)] pub struct SFunction { pub inputs: Vec<(String, VType)>, pub block: SBlock, diff --git a/mers/src/script/code_runnable.rs b/mers/src/script/code_runnable.rs index 85dc9a8..8945f3d 100755 --- a/mers/src/script/code_runnable.rs +++ b/mers/src/script/code_runnable.rs @@ -82,32 +82,23 @@ impl RFunction { #[derive(Clone, Debug)] pub struct RStatement { // (_, _, is_init) - pub output_to: Option<(usize, usize, bool)>, + pub output_to: Option<(Box, usize, bool)>, statement: Box, pub force_output_type: Option, } impl RStatement { pub fn run(&self, vars: &mut Vec, info: &GSInfo) -> VData { let out = self.statement.run(vars, info); - if let Some((v, derefs, is_init)) = self.output_to { - // let mut parent = None; - let mut val = &mut vars[v]; - fn deref(n: usize, val: &mut VData, is_init: bool, out: VData) { - if n == 0 { - if is_init { - *val = out.inner().to(); - } else { - val.assign(out.inner()); - } - } else { - if let VDataEnum::Reference(r) = &mut val.data().0 { - deref(n - 1, r, is_init, out) - } else { - unreachable!("cannot derefence: not a reference."); - } - } + if let Some((v, derefs, is_init)) = &self.output_to { + let mut val = v.run(vars, info); + // even if 0 derefs, deref once because it *has* to end on a reference (otherwise writing to it would be unacceptable as the value might not expect to be modified) + for _ in 0..(derefs + 1) { + val = match val.inner().deref() { + Some(v) => v, + None => unreachable!("can't dereference..."), + }; } - deref(derefs, val, is_init, out); + val.assign(out.inner()); VDataEnum::Tuple(vec![]).to() } else { out @@ -370,6 +361,7 @@ impl RStatementEnum { } } +#[derive(Debug)] pub struct RScript { main: RFunction, info: GSInfo, diff --git a/mers/src/script/global_info.rs b/mers/src/script/global_info.rs index fb15c24..7230982 100755 --- a/mers/src/script/global_info.rs +++ b/mers/src/script/global_info.rs @@ -6,6 +6,7 @@ use super::{builtins, val_type::VType}; pub type GSInfo = Arc; +#[derive(Debug)] pub struct GlobalScriptInfo { pub vars: usize, diff --git a/mers/src/script/to_runnable.rs b/mers/src/script/to_runnable.rs index c2d50aa..1e4be51 100755 --- a/mers/src/script/to_runnable.rs +++ b/mers/src/script/to_runnable.rs @@ -36,6 +36,7 @@ pub enum ToRunnableError { found: VType, problematic: VType, }, + CannotAssignTo(VType, VType), CaseForceButTypeNotCovered(VType), MatchConditionInvalidReturn(VType), NotIndexableFixed(VType, usize), @@ -129,6 +130,14 @@ impl ToRunnableError { } write!(f, ".") } + Self::CannotAssignTo(val, target) => { + write!(f, "Cannot assign type ")?; + val.fmtgs(f, info)?; + write!(f, " to ")?; + target.fmtgs(f, info)?; + write!(f, ".")?; + Ok(()) + }, Self::ForLoopContainerHasNoInnerTypes => { write!(f, "For loop: container had no inner types, cannot iterate.") } @@ -332,7 +341,16 @@ fn statement( ginfo: &mut GlobalScriptInfo, linfo: &mut LInfo, ) -> Result { - let mut statement = match &*s.statement { + statement_adv(s, ginfo, linfo, None) +} +fn statement_adv( + s: &SStatement, + ginfo: &mut GlobalScriptInfo, + linfo: &mut LInfo, + // if Some((t, is_init)), the statement creates by this function is the left side of an assignment, meaning it can create variables. t is the type that will be assigned to it. + to_be_assigned_to: Option<(VType, &mut bool)>, +) -> Result { + let mut state = match &*s.statement { SStatementEnum::Value(v) => RStatementEnum::Value(v.clone()), SStatementEnum::Tuple(v) | SStatementEnum::List(v) => { let mut w = Vec::with_capacity(v.len()); @@ -346,11 +364,18 @@ fn statement( } } SStatementEnum::Variable(v, is_ref) => { + if !linfo.vars.contains_key(v) { + if let Some((t, is_init)) = to_be_assigned_to { + *is_init = true; + linfo.vars.insert(v.to_owned(), (ginfo.vars, t)); + ginfo.vars += 1; + } + } if let Some(var) = linfo.vars.get(v) { RStatementEnum::Variable(var.0, { let mut v = var.1.clone(); stypes(&mut v, ginfo)?; v }, *is_ref) } else { - return Err(ToRunnableError::UseOfUndefinedVariable(v.clone())); + return Err(ToRunnableError::UseOfUndefinedVariable(v.clone())); } } SStatementEnum::FunctionCall(v, args) => { @@ -620,61 +645,103 @@ fn statement( if let Some(force_opt) = &s.force_output_type { let mut force_opt = force_opt.to_owned(); stypes(&mut force_opt, ginfo)?; - let real_output_type = statement.out(ginfo); + let real_output_type = state.out(ginfo); let problematic_types = real_output_type.fits_in(&force_opt, ginfo); if problematic_types.is_empty() { - statement.force_output_type = Some(force_opt); + state.force_output_type = Some(force_opt); } else { return Err(ToRunnableError::StatementRequiresOutputTypeToBeAButItActuallyOutputsBWhichDoesNotFitInA(force_opt.clone(), real_output_type, VType { types: problematic_types })); } } if let Some((opt, derefs)) = &s.output_to { - if let Some((var_id, var_out)) = linfo.vars.get(opt) { - let out = statement.out(ginfo); - let mut var_derefd = var_out.clone(); - for _ in 0..*derefs { - var_derefd = if let Some(v) = var_derefd.dereference() { - v - } else { - return Err(ToRunnableError::CannotDereferenceTypeNTimes( - var_out.clone(), - *derefs, - var_derefd, - )); - } - } - let inv_types = out.fits_in(&var_derefd, ginfo); - if !inv_types.is_empty() { - eprintln!("Warn: shadowing variable {opt} because statement's output type {out} does not fit in the original variable's {var_out}. This might become an error in the future, or it might stop shadowing the variiable entirely - for stable scripts, avoid this by giving the variable a different name."); - if *derefs != 0 { - return Err(ToRunnableError::CannotDeclareVariableWithDereference( - opt.clone(), - )); - } - linfo.vars.insert(opt.clone(), (ginfo.vars, out)); - statement.output_to = Some((ginfo.vars, 0, true)); - ginfo.vars += 1; + let mut is_init = false; + let optr = statement_adv( + opt, + ginfo, + linfo, + if *derefs == 0 { + Some((state.out(ginfo), &mut is_init)) } else { - // mutate existing variable - statement.output_to = Some((*var_id, *derefs, false)); + None + }, + )?; + let mut opt_type = optr.out(ginfo); + for _ in 0..*derefs { + if let Some(deref_type) = optr.out(ginfo).dereference() { + opt_type = deref_type; + } else { + return Err(ToRunnableError::CannotDereferenceTypeNTimes( + optr.out(ginfo), + *derefs, + opt_type, + )); } - } else { - let mut out = statement.out(ginfo); - for _ in 0..*derefs { - out = if let Some(v) = out.dereference() { - v - } else { - return Err(ToRunnableError::CannotDereferenceTypeNTimes( - statement.out(ginfo), - *derefs, - out, - )); - } - } - linfo.vars.insert(opt.clone(), (ginfo.vars, out)); - statement.output_to = Some((ginfo.vars, *derefs, true)); - ginfo.vars += 1; } + let opt_type_assign = match opt_type.dereference() { + Some(v) => v, + None => { + return Err(ToRunnableError::CannotDereferenceTypeNTimes( + optr.out(ginfo), + derefs + 1, + opt_type, + )) + } + }; + if state.out(ginfo).fits_in(&opt_type_assign, ginfo).is_empty() { + state.output_to = Some((Box::new(optr), *derefs, is_init)); + } else { + return Err(ToRunnableError::CannotAssignTo( + state.out(ginfo), + opt_type_assign, + )); + } + // + // if let Some((var_id, var_out)) = linfo.vars.get(opt) { + // let out = state.out(ginfo); + // let mut var_derefd = var_out.clone(); + // for _ in 0..*derefs { + // var_derefd = if let Some(v) = var_derefd.dereference() { + // v + // } else { + // return Err(ToRunnableError::CannotDereferenceTypeNTimes( + // var_out.clone(), + // *derefs, + // var_derefd, + // )); + // } + // } + // let inv_types = out.fits_in(&var_derefd, ginfo); + // if !inv_types.is_empty() { + // eprintln!("Warn: shadowing variable {opt} because statement's output type {out} does not fit in the original variable's {var_out}. This might become an error in the future, or it might stop shadowing the variiable entirely - for stable scripts, avoid this by giving the variable a different name."); + // if *derefs != 0 { + // return Err(ToRunnableError::CannotDeclareVariableWithDereference( + // opt.clone(), + // )); + // } + // linfo.vars.insert(opt.clone(), (ginfo.vars, out)); + // state.output_to = Some((ginfo.vars, 0, true)); + // ginfo.vars += 1; + // } else { + // // mutate existing variable + // state.output_to = Some((*var_id, *derefs, false)); + // } + // } else { + // let mut out = state.out(ginfo); + // for _ in 0..*derefs { + // out = if let Some(v) = out.dereference() { + // v + // } else { + // return Err(ToRunnableError::CannotDereferenceTypeNTimes( + // state.out(ginfo), + // *derefs, + // out, + // )); + // } + // } + // linfo.vars.insert(opt.clone(), (ginfo.vars, out)); + // state.output_to = Some((ginfo.vars, *derefs, true)); + // ginfo.vars += 1; + // } } - Ok(statement) + Ok(state) } diff --git a/mers/src/script/val_data.rs b/mers/src/script/val_data.rs index 297188f..b69da10 100755 --- a/mers/src/script/val_data.rs +++ b/mers/src/script/val_data.rs @@ -24,8 +24,8 @@ impl VData { return; } } - #[cfg(debug_assertions)] - eprintln!("VData: assign: overwriting my previous Arc because it was immutable."); + // #[cfg(debug_assertions)] + // eprintln!("VData: assign: overwriting my previous Arc because it was immutable."); *self = new_val.to(); } pub fn inner_replace(&mut self, new_val: VDataEnum) -> VDataEnum { @@ -90,22 +90,18 @@ impl VData { } impl Clone for VData { fn clone(&self) -> Self { - #[cfg(debug_assertions)] - eprint!("VData: Clone: "); let mut d = self.data.lock().unwrap(); let o = if d.1 { if Arc::strong_count(&self.data) > 1 { // mutable, copy the value to avoid accidentally modifying it. #[cfg(debug_assertions)] - eprint!( - "copying value due to clone of a mutable shared value. (strong count: {})", + eprintln!( + "VData: Clone: copying value due to clone of a mutable shared value. (strong count: {})", Arc::strong_count(&self.data) ); d.0.clone().to() } else { // mutable, but not shared. just change it to not being mutable. - #[cfg(debug_assertions)] - eprint!("setting mutable value to immutable to avoid copying. clone will happen when value is used mutably."); d.1 = false; // then return the same arc (-> avoid cloning) Self { @@ -113,15 +109,11 @@ impl Clone for VData { } } } else { - #[cfg(debug_assertions)] - eprint!("immutably cloning immutable value. no copy necessary."); // immutable, return the same arc (-> avoid cloning) Self { data: Arc::clone(&self.data), } }; - #[cfg(debug_assertions)] - eprintln!(); o } } @@ -229,6 +221,13 @@ impl VDataEnum { data: Arc::new(Mutex::new((self, true))), } } + pub fn deref(self) -> Option { + if let Self::Reference(r) = self { + Some(r) + } else { + None + } + } } // get() diff --git a/mers/src/script/val_type.rs b/mers/src/script/val_type.rs index 72125d1..21de3c5 100755 --- a/mers/src/script/val_type.rs +++ b/mers/src/script/val_type.rs @@ -100,6 +100,7 @@ impl VType { None } } + /// returns Some(t) where t is the type you get from dereferencing self or None if self contains even a single type that cannot be dereferenced. pub fn dereference(&self) -> Option { let mut out = Self::empty(); for t in self.types.iter() { diff --git a/mers/t.mers b/mers/t.mers new file mode 100644 index 0000000..70aa192 --- /dev/null +++ b/mers/t.mers @@ -0,0 +1,11 @@ +a = (max int) { + println("Max: " + max.to_string()) + for i max { + println(i.to_string()) + } +} +a.debug() +// why does this work +a.thread(10).await() +// and this just blocks and does nothing +a.run(10) diff --git a/thread.mers b/thread.mers index bf1317d..dbcadde 100755 --- a/thread.mers +++ b/thread.mers @@ -11,10 +11,12 @@ progress = 0 calculator = (max int) { sum = 0 for i max { - i = i.add(1) - sum = sum.add(i) + i = i + 1 + // println("i: {0}".format(i.to_string())) + println("i: {0} s: {1}".format(i.to_string() sum.to_string())) + sum = sum + i + 1 if fake_delay sleep(1) - progress = i.mul(100).div(max) + v = i * 100 / max } "the sum of all numbers from 0 to {0} is {1}!".format(max.to_string() sum.to_string()) } @@ -26,7 +28,7 @@ slow_calculation_thread = calculator.thread(if fake_delay 10 else 20000000) loop { sleep(1) println("{0}%".format(progress.to_string())) - progress.eq(100) // break from the loop + progress == 100 // break from the loop } // use await() to get the result from the thread. if the thread is still running, this will block until the thread finishes. diff --git a/when_clone.mers b/when_clone.mers new file mode 100644 index 0000000..954c3c3 --- /dev/null +++ b/when_clone.mers @@ -0,0 +1,8 @@ +&a = "value" +&list = ["a" "b" "c" ...] +&elem = &list.get_ref(1) +switch! elem { + [&string] elem.0 = "z" + [] {} +} +list.debug()