> I myself have no problem with unobtrusive ads that can help get the developers the money that they deserve.
That might be the case with advertising starting out in games, but it's likely to end up just as intrusive as it is on the web. Adverts don't sell their products unless you notice the adverts.
Compilers that implement something called Tail Call Optimization can convert recursive functions into iterative equivalents. This relies on the function either: returning a value *or* the result of a call to another function with new parameters. (it can be the same or different function)
e.g. a way to do it in C would look like:
f(int x){ .. some code..
if( cond ) return 0; else return f( x + y); }
Although in C it can look very ugly, for functional languages such as Haskell or Erlang, it is required as you have to express loops through recursion due to only being able to assign to variables once. In these langauges, it looks a lot better as you can pattern match on the value of arguments, allowing you to concisely deal with obvious error or base cases, leaving you to handle the generic cases without worrying about those cases. Scheme implementations are required to implement tail call optimization.
Starting out most of you skills are crap and your weapons are in bad condition. Later on when you get your skills up and have good condition weaponry you're able to pick off targets from a longer distance with free aim.
A second note is that nearly all weapons have a spread, so even with maxed small arms/energy weapons some weapons will still seem inaccurate. It's a nice touch of realism. Laser weapons, Lincoln's Reapter don't have spread, so you hit exactly where you're aiming with maxed skill/weapon condition. Also some weapons appear to be zeroed for a specific range, but you can get the hang of that pretty quickly.
There's also the (D)ETS, (disk) erlang term storage, which gives a simple key/value store. It can be shared and mutable, depending on creation parameters.
Afaik it's mostly used for the implementation Mnesia, a native term database for erlang.
With Erlang, it is "fairly" easy to identify pure function calls, as most non-pure all live in specific libraries. Erlang also has lightweight threads, so rather than trying to concentrate on small scale parallelism, programmers are mostly free to spawn the necessary number of threads to solve a problem. They obviously aren't totally free, but a lot cheaper than requesting a new thread from the underlying OS.
Haskell is essentially totally pure. All side effects are specifically spelled out, so the compiler has to actually identify them to compile your code in the first place.
Most of the problems in parallelizing functional languages is not identifying what can be made to run in parallel, but in figuring out if it's worth it.
Yes, their roadmap indicates that they will have support for OpenCL in beta form around the end of this quarter. http://www.geeks3d.com/?p=2582
New cards should hopefully have more or less full support, all that's likely to be required is driver upgrade/sdk/library etc.
What I think you mean, is that functional langauges allow you to have functions which are fairly generic, but encapsulate control flow structure.
For instance, if you have a list of items in a functional programming language [1,2,3,4,5], if you want to do a transform on each of these elements that is independant of the elements position, and without refernce to other elements, you'd use the highly common 'map' function.
Map almost universally is called with a single element transform, and a list (or other data structure that map can apply to).
In the end, certain cases of 'for' loops in languages such as Java,C*,C++*,Fortran have their equivlanet expression in a functional language
that looks like:
NewList = map Function OldList
Other common ones are filter, fold.
For loops and the like that require state, typically you use tail recursion, and most functional programming langauges trivally expand that optimization to the general case of tail call optimization, where any function F whose return value is the return value of the function G, then you don't need to retain F's stack frame, as F's result is simply G's result.
* C and C++ allow for the use of function pointers, which can allow a functional style. C++ is better than C is this regard, as the STL also comes with a set of functional algorithms such as map.
Symmetric multi-processing refers either the generally the type of cpus, i.e. all processors have the same capabilities, or to their relationship with memory. SMP is generally shared memory systems with a set of uniform processors.
http://en.wikipedia.org/wiki/Symmetric_multiprocessing
With Erlang you've got no shared data between threads (processes in Erlang terminology), along with immutable data. Both of these greatly simplify concurrency as you don't need locks. If you need a shared resource (such as a file or network socket), a trival way to implement it in Erlang is to have another process that simply acts as a interface between the resource and any other process(es).
To communicate between processes in Erlang you use asynchornous message passing, and by design you can block or wait for a limited time to recieve messages.
Have a look at the Actor model which Erlang implements: http://en.wikipedia.org/wiki/Actor_model
Unfortunately Ada doesn't prevent bad software management. Especially when you deactivate conversion checks, don't test with data that simulates what your hardware's going to do, and recycle code from a previous platform that has quite different operating charateristics.
But Mr. President.. we must not allow a holiday gap!
> I myself have no problem with unobtrusive ads that can help get the developers the money that they deserve.
That might be the case with advertising starting out in games, but it's likely to end up just as intrusive as it is on the web. Adverts don't sell their products unless you notice the adverts.
Although in C it can look very ugly, for functional languages such as Haskell or Erlang, it is required as you have to express loops through recursion due to only being able to assign to variables once. In these langauges, it looks a lot better as you can pattern match on the value of arguments, allowing you to concisely deal with obvious error or base cases, leaving you to handle the generic cases without worrying about those cases. Scheme implementations are required to implement tail call optimization.
Starting out most of you skills are crap and your weapons are in bad condition. Later on when you get your skills up and have good condition weaponry you're able to pick off targets from a longer distance with free aim. A second note is that nearly all weapons have a spread, so even with maxed small arms/energy weapons some weapons will still seem inaccurate. It's a nice touch of realism. Laser weapons, Lincoln's Reapter don't have spread, so you hit exactly where you're aiming with maxed skill/weapon condition. Also some weapons appear to be zeroed for a specific range, but you can get the hang of that pretty quickly.
There's also the (D)ETS, (disk) erlang term storage, which gives a simple key/value store. It can be shared and mutable, depending on creation parameters. Afaik it's mostly used for the implementation Mnesia, a native term database for erlang.
With Erlang, it is "fairly" easy to identify pure function calls, as most non-pure all live in specific libraries. Erlang also has lightweight threads, so rather than trying to concentrate on small scale parallelism, programmers are mostly free to spawn the necessary number of threads to solve a problem. They obviously aren't totally free, but a lot cheaper than requesting a new thread from the underlying OS. Haskell is essentially totally pure. All side effects are specifically spelled out, so the compiler has to actually identify them to compile your code in the first place. Most of the problems in parallelizing functional languages is not identifying what can be made to run in parallel, but in figuring out if it's worth it.
Yes, their roadmap indicates that they will have support for OpenCL in beta form around the end of this quarter.
http://www.geeks3d.com/?p=2582
New cards should hopefully have more or less full support, all that's likely to be required is driver upgrade/sdk/library etc.
Other common ones are filter, fold. For loops and the like that require state, typically you use tail recursion, and most functional programming langauges trivally expand that optimization to the general case of tail call optimization, where any function F whose return value is the return value of the function G, then you don't need to retain F's stack frame, as F's result is simply G's result. * C and C++ allow for the use of function pointers, which can allow a functional style. C++ is better than C is this regard, as the STL also comes with a set of functional algorithms such as map.
Symmetric multi-processing refers either the generally the type of cpus, i.e. all processors have the same capabilities, or to their relationship with memory. SMP is generally shared memory systems with a set of uniform processors.
http://en.wikipedia.org/wiki/Symmetric_multiprocessing
With Erlang you've got no shared data between threads (processes in Erlang terminology), along with immutable data. Both of these greatly simplify concurrency as you don't need locks. If you need a shared resource (such as a file or network socket), a trival way to implement it in Erlang is to have another process that simply acts as a interface between the resource and any other process(es). To communicate between processes in Erlang you use asynchornous message passing, and by design you can block or wait for a limited time to recieve messages. Have a look at the Actor model which Erlang implements: http://en.wikipedia.org/wiki/Actor_model
Unfortunately Ada doesn't prevent bad software management. Especially when you deactivate conversion checks, don't test with data that simulates what your hardware's going to do, and recycle code from a previous platform that has quite different operating charateristics.
http://en.wikipedia.org/wiki/Ariane_5_Flight_501