View Full Version : AviSynthLib v0.52b now released
maxxon
1st March 2012, 03:50
Yay!! Finally, this has been a while in the making, but I think I've finally got the AviSynthLib library in a way that I want.
EDIT: Just updated v0.5b to v0.51b which theoretically allows use of the AviSynthLib in AviSynth v2.07 or higher. Tested to work with AviSynth v2.58 and higher.
EDIT: Just updated v0.51b to v0.52b which replaces the workaround StrCmp() which was actually case insensitive, to a fully working case sensitive version.
Get AviSynthLib v0.52b (291.5kB) (https://sourceforge.net/projects/avisynthlib/) from SourceForge.
With this base library you can use arrays as queues/stacks and things to iterate over. Anyone who writes scripts for AviSynth could benefit from this library. I've tried to make these as fast as possible for running very low and long manipulations, yet somewhat easier to use since 0.1b. For just the casual user though, these are super fast. Iterating and making decisions on over 2000 items takes 2-4 seconds (in comparison, AvsLib took over a minute and a half on 64 elements).
But that's not all, while making usable fast arrays that can store any type a reality (referenceArray.avs), several other libraries fell out too.
Native for loops (for.avs)
Blocks to contain data in a string format (block.avs)
Memory management (memory.avs)
Profiling tool (profile.avs)
Regression testing (testing.avs)
File and path manipulations and searches (file.avs)
Variable scope insertion (var.avs/varConst.avs)
Additional hex number support (hex.avs)
Additional string support (string.avs)
Including script files only once with ability to have multiple auto searched include directories (include.avsi)
There is also a usage document (AviSynthLib Usage.pdf) which can help you get started in understanding these libraries.
Some changes that occurred between 0.1b and 0.5b:
Replaced old SESA/RA_foreach construct with a new improved model
Introduced file, string, include, vars, and varsConst libraries.
Added and fixed SESA/RA_findSorted, SESA/RA_setSorted functions.
Added ability to take variables into and out of the for loop scope.
Fixed some miscellaneous bugs.
Added AviSynthLib Usage.odt/AviSynthLib Usage.pdf for your reading pleasure and updated the README.txt file.
I hope you make good use out of this and enjoy these libraries as much as I had making them. Feel free to post questions here in this forum or email me at adrianh[D0T]bsc[@T]gmail[D0T]com. Please put in the subject line the word AviSynthLib so that it will be sorted for optimal reading.
TTFN :thanks:
|\/|x
P.S. If you are using a version of AviSynth prior to 2.60 *AND* you did not install in C:\Program Files\AviSynth 2.5, you must make a modification to the include.avsi file. Look for this line in that file:
global ScriptDir="C:\Program Files\AviSynth 2.5\plugins\"
You must change that path to your installation directory. Also, make sure you keep the trailing "\plugins\" folder listed.
Also, it should work on versions prior to 2.58. I've not tested this, though if any of you are still running such a system I would be interested in finding out if it works properly.
pandy
1st March 2012, 10:06
What is your emai address? I am interested
adrianh[D0T]bsc[@T]gmail[D0T]com
hanfrunz
1st March 2012, 11:14
Hello maxxon,
can you explain in few words who can use the lib? Is it for plugin developers? Looks very interesting, but i don't understand for what to use it. Maybe i'm getting old :)
regards,
hanfrunz
StainlessS
1st March 2012, 17:22
Have only just taken a brief look but found something that stuck out immediately.
I see nothing indicating an Avisynth v2.6 requirement, but does use eg
'Script***' functions added in v2.6, eg ScriptDir, ScriptName, ScriptFile
(at least some of them. EDIT: Only ScriptDir).
There is a thread somewhere on synthesized versions of those functions
using Try/Catch but a bit messy.
Perhaps a v2.6 requirement might not be such a bad idea, start from a
solid position.
EDIT: My view, 2.6alpha3 is generally at least as reliable as 2.58 and has
new found problems fixed whereas 2.58 does not.
Gavino
1st March 2012, 18:05
Native for loops (for.avs)
What do you mean by 'native' here?
maxxon
1st March 2012, 22:52
Hello maxxon,
can you explain in few words who can use the lib? Is it for plugin developers? Looks very interesting, but i don't understand for what to use it. Maybe i'm getting old :)
regards,
hanfrunz
Anyone using the AviSynth scripting language. This is an addon for those users to be able to do more interesting things.
|\/|x
maxxon
1st March 2012, 23:07
Have only just taken a brief look but found something that stuck out immediately.
I see nothing indicating an Avisynth v2.6 requirement, but does use eg
'Script***' functions added in v2.6, eg ScriptDir, ScriptName, ScriptFile
(at least some of them. EDIT: Only ScriptDir).
There is a thread somewhere on synthesized versions of those functions
using Try/Catch but a bit messy.
Perhaps a v2.6 requirement might not be such a bad idea, start from a
solid position.
EDIT: My view, 2.6alpha3 is generally at least as reliable as 2.58 and has
new found problems fixed whereas 2.58 does not.
:goodpost:
Thanks for the heads up Stainless, that totally got by me. I've written some workarounds into the include.avsi file and am releasing it under v0.51b. Unfortunately, sourceforge isn't allowing me to update anything at the moment. As soon as it does, I'll upload it.
EDIT: The requirements aren't that stringent. If someone wishes to use it with an older version, they can go ahead. One thing that I found in the new 2.6alpha which could so something odd is that if you concatenate a 4095 character string with a single character string, you can get junk on the end. Since my lib relies on concatenation, this could be a problem, but you would have to hit the library pretty hard.
|\/|x
maxxon
1st March 2012, 23:11
What do you mean by 'native' here?
I mean, without using an external filter such as GScript. It works entirely within the confines of the AviSynth scripting language.
|\/|x
maxxon
3rd March 2012, 06:56
In the AviSynthLib Usage guide, I found an error in the For Revisited section. It is highlighted here in red.
For Revisited
Well, now that we know about vars and varsConst, we can use that in our for loops too. Just insert the vars object prior to the start index. If you remember our previous example:
var1Ref = blankclip.mem_new
result = for(0, 2, """
var1Ref=""""+var1Ref+""""
var1Ref.mem_set(version)
for_returnStop("done")
"""", "").for_result
assert(result == "done")
var1Ref.mem_get
This now can be rewritten like this
var1 = blankclip
result = for(vars_push("var1").eval, 0, 2, """
var1 = version
for_returnStop("done")
"""", "").eval.for_result
assert(result == "done")
var1
which still does the same thing but is a bit cleaner.
Note that if you had done this without the .eval, an error would have been generated, followed by the stack info:
Avisynth error:
Didn't eval last vars_push.
(C:\Program Files\AviSynth 2.5\plugins\AviSynthLib\vars.avs, line 330)
(C:\Program Files\AviSynth 2.5\plugins\AviSynthLib\vars.avs, line 209)
(C:\Program Files\AviSynth 2.5\plugins\aviSynthLib\for.avs, line 173)
(testFile.avs, line 16)
Unfortunately, this is actually reporting the error after it has passed the missing .eval so the stack position is only coincidentally close to where it happened. If it were possible to get the stack info at any time, I would be able to pull that data at time of push, making this somewhat easier to debug.
Ahhh well. Such is life. At least it does say what function call it was that was forgotten to be evaled.
This has been revised in the new version, but I will not release that as yet. The standalone .pdf doc will be updated, but I'm not updating the version in the .7z archive. I'll probably, in fact, remove this from the archive next time around so that I will be able to do mods on that doc without impacting the release build.
|\/|x
maxxon
7th March 2012, 18:29
BTW, if anyone actually thinks these libraries are useful or think of something else that could be done, please feel free to post. :)
|\/|x
jmac698
7th March 2012, 22:07
Hi,
I've written a function to substitute actual variables into a masktools expression. Instead of x+" "+y+" +" stuff you could just write argstr="x y +". I thought of a few ways to interface this, I could call something like makeexp("x y +",x,y) or else use eval and just pass something easier (I forget exactly now).
In order to get this working I had to write a parser in avisynth script! There is heavy use of search and replace on strings. I could probably use your lib for this, but even, add it to your lib - however this seems mostly specific to create arguments for masktools. Would that be within the scope of what you want in the library?
maxxon
13th March 2012, 08:21
Hi,
I've written a function to substitute actual variables into a masktools expression. Instead of x+" "+y+" +" stuff you could just write argstr="x y +". I thought of a few ways to interface this, I could call something like makeexp("x y +",x,y) or else use eval and just pass something easier (I forget exactly now).
In order to get this working I had to write a parser in avisynth script! There is heavy use of search and replace on strings. I could probably use your lib for this, but even, add it to your lib - however this seems mostly specific to create arguments for masktools. Would that be within the scope of what you want in the library?
Interesting... I'm not sure what you would use this for, but could be interesting.
The reference arrays could do something similar. Say you had a 2 or more element array, and you wished to separate the values with spaces and end the list with a " +". You could do this (assuming that array is the array in question):
array.RA_csv(" ")+" +"
So to do exactly what you were saying with x and y it would look like this:
array=RA_new(x, y)
argstr=array.RA_csv(" ")+" +"
array.RA_delete
I have written a parser in the AviSynth scripting language, but I do find it 'slow' (I was testing a structure implementation). I was finding it taking a second to do something which I could do in 10s of milliseconds using native structures such as function calls.
However, I would be interested in your ideas. Please let me know what purpose this would be for so that we can discuss this further.
:thanks:
|\/|x
jmac698
14th March 2012, 05:22
Hi,
Something like this.
The point is to turn "x*y" into "1 2 *" for masktools. The reason is that the complex expressions I had to make for masktools was too hard to write, debug, or create.
expr=test(1,2)
#returns "1 2 *"
messageclip(expr)
function test(int x, int y){
global tmp_x=x
global tmp_y=y
makeexpr("x*y")
}
function makeexpr(string template){
template=mt_polish(template)
template=leftstr(template,strlen(template)-1)
expr=StrSplit(template,0,"")
leftstr(expr,strlen(expr)-1)
}
function var_repl(string base, int currpos, string currexpr){
sep="$"#separator starting variable name (ends with non-alphabet character)
subbase=midstr(base,currpos+StrLen(sep))#remainder from currpos
pos = FindStr(subbase, sep)#find the next separator
currsubexpr=(pos==0)?midstr(subbase,1):midstr(subbase,1,pos-1)#the leftmost subexpr, i.e. from currpos to space-1/end
return (pos == 0 || subbase=="") \
? currexpr+process(currsubexpr) : StrSplit( \
base, currpos+pos, currexpr+process(currsubexpr) \
)
}
function process(string subexpr){
knownops="*"
#return "$"+subexpr
#"+-*/%^sincostanasinacosatanexplogabsroundclipminmax&|&!°@&u|u°u@u~u<<u>>u&s|s°s@s~s<<s>>s<><=>=!====pi?"
findstr(subexpr,knownops)<>0 ? subexpr+" " : eval("string(tmp_"+subexpr+")")+" "
}
function strClassify(string s, string special){
#Classify a character as symbol (1), number (2), letter (4), special (8) or null (0)
s=leftstr(s,1)
s=="" ? 0 : \
s==special ? 8 : \
(s>="a" && s<="z") || (s>="A" && s<="Z") ? 4 : \
s>="0" && s<="9" ? 2 : \
1
}
function FindStrClass(string base, int classmask, string special){
#Return position of specified character class
#symbol=1, number=2, letter=4, special=8, null=0
#these can be combined for classmask,
#e.g. maskclass=14 is special or letter or number
FindStrClass2(base, classmask, special, 1)
}
function FindStrClass2(string base, int classmask, string special, int currpos){
substr=midstr(base,currpos,1)
t=binbool(strClassify(substr, special),classmask,"and")==0 || currpos==strlen(base)+1
t ? currpos-1 : \
FindStrClass2(base, classmask, special, currpos+1)
}
function binbool(int a, int b, string op){
#Find the binary AND or OR on a and b
op=lcase(op)
op=op=="or"?"||" : \
op=="and"?"&&" : \
strlen(op)==1?op+op:op
binbool2(a, b, op, 0)
}
function binbool2(int a, int b, string op, int currresult){
m=max(a,b)
pwr2=int(pow(2,floor(log(m)/log(2))))
bit_a=floor(a/pwr2)
bit_b=floor(b/pwr2)
t=eval(string(bool(bit_a))+op+string(bool(bit_b)))?pwr2:0
currresult=currresult+t
a=a-bit_a*pwr2
b=b-bit_b*pwr2
a+b==0?currresult:binbool2(a, b, op, currresult)
}
function bool(int n){
#Return false if n=0, true otherwise
n==0?false:true
}
maxxon
15th March 2012, 02:22
Well jmac, if it is something that you think would be useful to the community and wish to contribute, then great. :)
However, if you want to add it to AviSynthLib, then I would require it to abide by the naming conventions to keep it from potentially interfering with other libraries as well as commenting the interfaces (both 'private' and 'public', where the private one is for maintainers and the public is for library users) as a minimum. Looks like you have done some inline commenting which is good. :)
The coding standards are pretty minimal. All functions and global variables related to the library need to:
Be located in a file which:
Has a GPL (http://www.gnu.org/copyleft/gpl.html) or compatible agreement at the beginning
Followed by a verbose description of what the library does, caveats and potentially a usage guide
Followed by a log.
My suggestion is that you just copy and paste from one of my libraries and modify as needed.
Be prefixed with the same name or acronym, followed by:
One underscore ('_') (no that's not supposed to be a face :)) to represent a function or global name for public consumption.
Two or more underscores to represent internal a function or global not to be used directy by external users of the library. I usually use two for private and three for autogenerated functions/globals, but whatev.
You would also need an account on sourceforge.net (http://sourceforge.net) and I would then give you access to the AviSynthLib project. I will try and give you a hand if you are not familiar with this.
Please note, you don't have to combine with my library, but you are more than welcome to.
EDIT: Also note, that if you are doing this as a one shot, that's fine, but then really comment your code please so that other maintainers can figure out what you have done. By adding to this library, it would be great if you can at least maintain your own code.
|\/|x
jmac698
15th March 2012, 08:02
I'm trying this, it's pretty wonky though:
forResult = for(2,11,"""
for_returnContinue(string(value(forState) + forIndex))
""","1").for_result
messageclip(forResult)
Could you make forState take a var so I could use an int? There must be a way to make a more normal for loop like
s=0
for(1,10,"""
s=s+forIndex
""")
Gavino
15th March 2012, 10:21
There must be a way to make a more normal for loop
Yes. It's called GScript. :D
maxxon
15th March 2012, 17:17
I'm trying this, it's pretty wonky though:
Could you make forState take a var so I could use an int?
It is possible that I could, but then I'd have to kill you. :D
The thing is, this is a generic for loop intended for certain optimizations and building strings while being as fast as possible without going outside and using a filter like GScript. You can do something like you want without the string conversion stuff, but it would probably look more like this:
result = 1
for(vars_push("result").eval, 2,11,"""
result = result + forIndex
""","").eval
messageclip(result)
There must be a way to make a more normal for loop like
s=0
for(1,10,"""
s=s+forIndex
""")
Yeah, somewhat normal like this:
s=0
for(vars_push("s").eval, 1,10,"""
s=s+forIndex
""", "").eval
This pushs the "s" variable out of the current scope and pops it into the scope of the for loop. The final eval then pops it back into the original scope.
I've been thinking about making the forState init value optional, but the foreach functions require it just to be able to determine which foreach is to be used. Because of this, I've been keeping it in to keep it consistent. This may change in the future, but I'm not sure for now.
Oh and in case you don't want to type forIndex but would prefer a different name, you could do this:
s=0
for(vars_push("s").eval, 1,10,"""
s=s+i
""", "", stateVar="i").eval
I would recommend reading the AviSynth Usage.pdf (http://sourceforge.net/projects/avisynthlib/files/) for more info. It should also be in your scripts folder already as it is part of the download of the library.
Yes. It's called GScript. :D
Plugger! :D
Seriously though, I've not yet benchmarked GScript's for loop, but I've refrained from using it just because the core of my library is loop heavy and just the loading and unloading of the GScript plugin would probably have a negative performance impact. But this is yet to be determined empirically. However, you could put your entire script within it minimizing the load/unload overhead.
|\/|x
Gavino
15th March 2012, 17:58
I've not yet benchmarked GScript's for loop, but I've refrained from using it just because the core of my library is loop heavy and just the loading and unloading of the GScript plugin would probably have a negative performance impact.
The plugin is only loaded once, no matter how many times it is called. The only overhead(*) of using GScript is that the string argument is effectively parsed twice, first by Avisynth as a string literal and then again as script code by the GScript parser. Even this (small) overhead can be avoided by using GImport.
(*)Also bear in mind that this is only a compile-time overhead and does not affect frame-serving performance.
maxxon
15th March 2012, 19:59
The plugin is only loaded once, no matter how many times it is called. The only overhead(*) of using GScript is that the string argument is effectively parsed twice, first by Avisynth as a string literal and then again as script code by the GScript parser. Even this (small) overhead can be avoided by using GImport.
(*)Also bear in mind that this is only a compile-time overhead and does not affect frame-serving performance.
Well, I'll try this soon. Made a test branch in AviSynthLib to see if I can use gimport in place of import in my include.avsi file (also had to rename for function symbol in my lib so not to name clash with GScript) and under AviSynth 2.60, it did something very unexpected. While loading my core, ScriptDir said it was in the wrong directory, which caused my core loadup to bail since it couldn't find a file.
Tired to replicate with something simple, but could not. Under AviSynth 2.54 there was no issue as a call to include properly sets up the ScriptDir variable. The ScriptDir seems to be affected by the GImport, but not sure how as it doesn't always happen. I don't get a problem when I don't use GImport in either version of AviSynth.
Other than that, it appeared not to add any load overhead.
I'll look into further profiling this later.
|\/|x
EDIT: Ok, I found the problem. Looks like it is because ScriptDir is being set to what file GImport is being called from, not the file where the function that is calling GImport is being called from. See attached zip file for an example. Replace gimport with import in the z.avs file to see how it should work.
EDIT: Moving attachment and bug to this (http://forum.doom9.org/showthread.php?p=1565415#post1565415) thread.
StainlessS
2nd February 2013, 18:37
:if you concatenate a 4095 character string with a single character string, you can get junk on the end. Since my lib relies on concatenation, this could be a problem, but you would have to hit the library pretty hard.
Hi Maxxon, nice to see you about again. :)
Dont know if you implemented a script fix for string cat 4096 problem, but you could use RT_Stats RT_StrAddStr() func to avoid. there is also an RT_TxtAddStr() func to concatenate strings with a Chr(10) separator (I use it to create pseudo arrays as strings with good effect). The RT_ lib also has hex conversion funcs with a bug fix and also more general number conversion funcs base 2 -> 36.
Give it a peek.
http://forum.doom9.org/showthread.php?t=165479
EDIT: NOTE, 4096 and HexValue bugs are fixed in v2.6a4
maxxon
4th February 2013, 08:01
Thanks StainlesS, I'm sorta going to be in and out as I am looking for a job and need one soon.
That's great about your string code. I think I had a workaround, but dunno if I implemented it. I'll have to go back into the code and see. If not, I'll implement using your dll for a fix. Need to see if Gavino's GScript has been updated and do some benchmarking on that too. Good to know that there are fixes out there.
As for using a character separator to make a string into an array, that can be kinda slow due to searching and breaking up strings (that's how AvsLib worked) and is why I implemented the reference array. However, this was within the confines of the AviSynth language, and if you have implemented this as a dll, it would not be as slow (though how fast would have to be determined).
Will definitely take a look at your lib. Thanks again for the regreet and the heads up. :)
|\/|x
martin53
27th October 2013, 21:46
maxxon, your work looks, I admit, somewhat strange, but powerful to me.
I was unable to use it just with the given documentation.
Could you please post an example that does the following:
- define (allocate) two one dimensional arrays with lower bound 0 and upper bound clip.FrameCount-1, one containing bools, the other float values.
- Show how to put data into elements of the array and read data from elements, from the runtime environment.
- deallocate the arrays the proper way - you state that RA_ arrays need to.
The using script might look like this
function SetSceneChangeProbability(clip c, int framenumber) {
# this function runs completely in RTE
Evaluate frame [framenumber]
put result to float array[framenumber]
set bool array[framenumber] to true
}
function Show3SceneChangeProbabilities(clip c) {
c.ScriptClip("""
check if bool array[current_frame -1] is true
if not, call SetSceneChangeProbability(c, current_frame-1)
check if bool array[current_frame] is true
if not, call SetSceneChangeProbability(c, current_frame)
check if bool array[current_frame +1] is true
if not, call SetSceneChangeProbability(c, current_frame+1)
display values for current_frame-1, current_frame and current_frame+1 from float array as subtitles
""")
}
Create bool array and init to all false
Create float array
ColorBars()
Show3SceneChangeProbabilities()
deallocate float array
deallocate bool array
I need advice with the red parts. :thanks: in advance - also to everyone else who can help, of course!
StainlessS
3rd November 2013, 15:56
@Martin53, I recently took a peek at this quite amazing library and it looks to me (on brief inspection) that it is
intended only for small arrays maybe max dim of about 100, but I did not really understand without spending
a lot more time on it.
Perhaps wanting array of max dim FrameCount is ambitious expectation of the script language.
Perhaps others who have mastered usage could advise.
maxxon
1st April 2016, 17:24
Sorry I've not been around everyone. Been doing other things and lost track of this library.
StainlessS, this library should be able to hold a very large array. It can only initialize an array of 100 elements at a time. From there you can splice them together. The max array size is limited to how much memory is available and how big a string can be. My RA library relies on my Mem library which can allocate 16^8 or 4G elements, which would probably blow up your application before it ever got that big. The max application address space under Windows is 3Gb on a 32 bit app that is Large Address Aware, or around 1.5GB if not Large Address Aware. If AviSynth is a 64 bit application, then you might be able to use it to it's maximum if something else doesn't blow up first as the application space gets beyond the 100s of GBs. However, as my arrays are in reality string objects, depending on how strings are manipulated internally, this will possibly start to bog down if you start passing very large arrays around.
Just a FYI on how these libraries are interconnected:
The Mem library allocates a variable that has a 8 character suffix. That suffix is a 8 character hex number. That is what limits how many objects can be allocated. The handle value returned by the Mem library is that 8 character string.
The SESA library is a library that allows O(1) access to string which represents an array of elements whose size are all the same length. It generates a string of these concatenated elements of the same length, thus allowing to pick off an element through a simple offset calculation.
The RA library joins the Mem library to the SESA library to allow O(1) access to any object type. Please note that by O(1), I mean that the library can look up the variable name in O(1) time. How AviSynth does name lookups internally is another matter that is beyond my knowledge, but I'd hope that it would use at least an O(ln(N)) search routine.
If you want to see how to use a RA object, please see the AviSynthLib Usage document (file:///D:/Users/adrian.hawryluk/Downloads/AviSynthLib%20Usage.pdf). There's a section entitled Reference Array (page 11) that should help.
As for you martin53, I apologize that I didn't get your message sooner. After a while, when I didn't get any messages, I just stopped looking. I only bothered doing a filter today to see if I got any messages just because I stumbled on my work again while googling.
If you have any other questions after reading the Usage doc, please feel free to post or email.
Thanks for your interest.
|V|x
StainlessS
2nd April 2016, 10:51
Maxxon, nice to see you back again.
For your info, RT_Stats has had both DBase (up to 1024 fields / 2 billion records) and Array (up to 3 Dims) implemented for some time, coming version extended for arrays and DBase over 2GB.
(Both Implemented as File)
http://forum.doom9.org/showthread.php?t=165479&highlight=rt_stats
TheFluff
2nd April 2016, 21:41
why do you guys insist on this kind of stuff? why? it makes me want to scream
I mean, you can code in C++, so you're definitely aware that there is more than one programming language. Have you ever reflected on why there are so many programming languages in wide use? They're all Turing-complete, right, so you can solve any problem with any of them. So why don't we just pick one, like you guys seem to have picked Avisynth script?
The thing here is that programming is about expressing yourself. You want to describe your solution to the problem in a clear and concise way, and hopefully in a way that the compiler can translate into something that the machine will be able to execute quickly. This is why we have so many different programming languages: they're good at different things, and different people like to express themselves in different ways. Avisynth script is a domain-specific language, or a language that's custom tailored to solving a specific type of problems. It's very good at what it was designed for, but since it's basically a toy language that was hacked together by BenRG a decade and a half ago on a whim, it gets really clunky if you try to solve basically any problem that isn't "build a filter chain". If I wanted to, I could write the equivalent of any Avisynth filter chain in C, but I don't do that because it'd be much more tedious than just writing it in Avisynth script. Likewise, I could write a C compiler in Avisynth script if I absolutely had to, but that would just be retarded, so I don't do that either.
The thing you're trying to do here is kinda like trying to dress up a pig. You're not solving any of the problems inherent to Avisynth script, you're just tacking on a very ugly, inconsistent and slow implementation of a general-purpose language on top of it. Almost anything you can do with these language extensions would be better done either with a plugin or by writing some utility in a high level language that interfaces directly with the Avisynth API and/or generates Avisynth scripts. You're missing the entire point of having a domain-specific language in the first place.
Back in the early 1990's, the UNIX-Haters Handbook called this kind of thing "power tools for power fools".
StainlessS
2nd April 2016, 22:02
Why dont you go be 'jovial' somewhere else.
maxxon
4th April 2016, 17:30
why do you guys insist on this kind of stuff? why? it makes me want to scream
Because, it wasn't available at the time, I didn't know that it could be extended, and wasn't interested in doing so after I wrote the library. Also, I find functional languages and scripting languages kinda interesting, and I wanted to see how far I could push it. And I think most would say that I pushed it really far. Could also be possible that some people don't want to download DLLs.
Note that my library isn't just about arrays. I did do some other pretty good stuff in it, which would allow programming in AviSynth easier. I think the profiler, regression testing and the assertion libs are the better ones, but there are others too.
Also seems that there are still people who download my library even now, which I find kinda cool.
Why dont you go be 'jovial' somewhere else.
:D
Maxxon, nice to see you back again.
Thanks. Not sure how long I'll be here. We'll see.
For your info, RT_Stats has had both DBase (up to 1024 fields / 2 billion records) and Array (up to 3 Dims) implemented for some time, coming version extended for arrays and DBase over 2GB.
(Both Implemented as File)
Nice. Good to know.
|V|x
vBulletin® v3.8.11, Copyright ©2000-2026, vBulletin Solutions Inc.