Objects add inverse order methods

Discuss the future of the AutoHotkey language
crocodile
Posts: 98
Joined: 28 Dec 2020, 13:41

Objects add inverse order methods

12 Aug 2023, 14:27

I'm not sure if this is a good proposal, but in the use of AutoHotkey, I will often use inverse traversal, which is, of course, very cumbersome to implement.
I searched some other languages and it seems they all support inverse order traversal.


This is the implementation of inverse order using AutoHotkey:

Code: Select all

arr := []
for k, v in Map("a", 1, "b", 2)
	arr.InsertAt(1, [k, v])

for n in arr
	;
This is the built-in method I was hoping for:

Code: Select all

for k, v in Map("a", 1, "b", 2).rev()
	;
ntepa
Posts: 429
Joined: 19 Oct 2022, 20:52

Re: Objects add inverse order methods

12 Aug 2023, 19:20

Here's one way to implement it:

Code: Select all

Map.Prototype.DefineProp "Rev", {
    Call: (m) => (keys:=[m*], f(&k?, &v?) => keys.Length ? (v := m[k:=keys.Pop()], 1) : 0, f)
}

for k, v in Map("a", 1, "b", 2, "c", 3).Rev() {
    OutputDebug k ", " v "`n"
}
lexikos
Posts: 9592
Joined: 30 Sep 2013, 04:07
Contact:

Re: Objects add inverse order methods

13 Aug 2023, 21:29

Inverse of what order? As far as I recall, the map enumerator (documentation) does not guarantee any particular order.
crocodile
Posts: 98
Joined: 28 Dec 2020, 13:41

Re: Objects add inverse order methods

14 Aug 2023, 09:15

Sorry, I didn't find anything order related in the documentation (but I really checked the documentation carefully).
I tried the following code 1000000 times and got the same order. Can you tell me how to modify this object to break this order?

Code: Select all

	m := Map("a", 1, "b", 2, "c", 3)
	loop 100
		m[A_Index] := A_Index

	st := ""
	for k, v in m
		st .= k ": " v ", "
	st2 := st
	loop 1000000
	{
		st := ""
		for k, v in m
			st .= k ": " v ", "
		if st2 != st
			MsgBox "err> " st

	}
	MsgBox st
; 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19, 20: 20, 21: 21, 22: 22, 23: 23, 24: 24, 25: 25, 26: 26, 27: 27, 28: 28, 29: 29, 30: 30, 31: 31, 32: 32, 33: 33, 34: 34, 35: 35, 36: 36, 37: 37, 38: 38, 39: 39, 40: 40, 41: 41, 42: 42, 43: 43, 44: 44, 45: 45, 46: 46, 47: 47, 48: 48, 49: 49, 50: 50, 51: 51, 52: 52, 53: 53, 54: 54, 55: 55, 56: 56, 57: 57, 58: 58, 59: 59, 60: 60, 61: 61, 62: 62, 63: 63, 64: 64, 65: 65, 66: 66, 67: 67, 68: 68, 69: 69, 70: 70, 71: 71, 72: 72, 73: 73, 74: 74, 75: 75, 76: 76, 77: 77, 78: 78, 79: 79, 80: 80, 81: 81, 82: 82, 83: 83, 84: 84, 85: 85, 86: 86, 87: 87, 88: 88, 89: 89, 90: 90, 91: 91, 92: 92, 93: 93, 94: 94, 95: 95, 96: 96, 97: 97, 98: 98, 99: 99, 100: 100, a: 1, b: 2, c: 3, 
User avatar
boiler
Posts: 16984
Joined: 21 Dec 2014, 02:44

Re: Objects add inverse order methods

14 Aug 2023, 14:41

You seem to be intent on getting someone to state something other than its order is not guaranteed. Don't read any more into it than that.

crocodile wrote: I tried the following code 1000000 times and got the same order.
Just because you found it to be repeatable (and for the map as created/stored exactly the same way every time) doesn't mean that it would always be so, especially in future builds.

crocodile wrote: Can you tell me how to modify this object to break this order?
He didn't say there was a way for it to be modified. Its order not being guaranteed is very different than being user-definable.

Return to “AutoHotkey Development”

Who is online

Users browsing this forum: No registered users and 20 guests