digitalmars.D - A little Go => Python story
- bearophile (56/56) Apr 23 2013 This blog post tells a short simple story of replacing Python
- =?UTF-8?B?Ikx1w61z?= Marques" (1/1) Apr 23 2013 The only one that seems "easy" to solve in D is adding sets, no?
- Diggory (1/1) Apr 23 2013 Perhaps you should be able to use void[T] for a set...
- bearophile (16/17) Apr 23 2013 Considering the troubles given by the built-in D associative
- Jesse Phillips (8/14) Apr 23 2013 I think D already has this addressed, though maybe not with
- bearophile (4/4) Apr 23 2013 Sorry, the title of this thread should be "A little Python => Go
- OlliP (22/22) Jun 23 2013 I knew a little Go and then by chance had a look at Python. The
This blog post tells a short simple story of replacing Python with Go: http://blog.repustate.com/migrating-code-from-python-to-golang-what-you-need-to-know/2013/04/23/ Probably the SVM code was already written in C, and just called from Python. I don't know if later they have rewritten the SVM code in Go, I doubt this. Its Reddit thread: http://www.reddit.com/r/programming/comments/1cy3si/what_python_developers_need_to_know_before/ This story shows that it doesn't take a lot for some people to switch languages. Go is designed to appeal to Python coders, and this helps. I think Go is simpler than D and this helps Python programmers that don't know a lot about the complexities of a system languages. The blog post also lists many problems or troubles in converting Python code to Go, some of them apply as well to the converion of Python code to D (from this selection I have removed some silly things like "Go doesn't allow to have dict values of mixed types"): * No built-in type for sets (have to use maps and test for existence) * In absence of sets, have to write your own intersection, union etc. methods * Python is more forgiving. You can take slices of strings using indexes that are out of range and it won't complain. You can take negative slices -- not Go. * No unpacking of a tuple or list into separate variables (e.g. x,y,x = [1,2,3]) * Reading Go code is definitely more like a programming language whereas Python can be written as almost pseudocode. Go has more non-alphanumeric characters and uses || and && instead of "or" and "and". * Writing to a file, there's File.Write([]byte) and File.WriteString(string) – a bit of a departure for Python developers who are used to the Python zen of having one way to do something * If you're using JSON and your JSON is a mix of types, goooooood luck. You'll have to create a custom struct that matches the format of your JSON blob, and then Unmarshall the raw json into an instance of your custom struct. Much more work than just obj = json.loads(json_blob) like we're used to in Python land. In the Reddit thread they also discuss a bit about a problem of Go dicts, but that problem is not present in D: struct Foo { int bar, baz; } void main() { import std.stdio; Foo[string] a; a["hello"] = Foo(23, 42); writeln("a: hello = ", a["hello"]); a["hello"].bar = 0; writeln("a: hello = ", a["hello"]); } Bye, bearophile
Apr 23 2013
The only one that seems "easy" to solve in D is adding sets, no?
Apr 23 2013
Perhaps you should be able to use void[T] for a set...
Apr 23 2013
Luís Marques:The only one that seems "easy" to solve in D is adding sets, no?Considering the troubles given by the built-in D associative arrays, and the possibility to write good enough set literals like: auto s1 = set([1, 10, 5]); // helper function. Set!int items = iota(2, 11) .map!(x => x % 10) .set; Then I think it's enough to add a Set!T in std.collections with the nice semantics of the Python sets, plus the set() helper. Here the only limit is that D uses opCmp for all its comparisons, so some of the operators of the Python sets can't be defined, and they need to be only normal methods for the Set!T. I am not worried. Bye, bearophile
Apr 23 2013
On Tuesday, 23 April 2013 at 23:09:46 UTC, bearophile wrote:* If you're using JSON and your JSON is a mix of types, goooooood luck. You'll have to create a custom struct that matches the format of your JSON blob, and then Unmarshall the raw json into an instance of your custom struct. Much more work than just obj = json.loads(json_blob) like we're used to in Python land.I think D already has this addressed, though maybe not with std.json. obj = json.loads(json_blob) to obj = json.loads!MyType(json_blob) Defining the type doesn't really seem the major problem with the Go approach.
Apr 23 2013
Sorry, the title of this thread should be "A little Python => Go story"... Bye, bearophile
Apr 23 2013
I knew a little Go and then by chance had a look at Python. The similarities in syntax were striking. Because of the very quick build times, Go feels like a scripting language. However, it really falls short on OOP. Delegates in Go can mimic inheritance to some extend, but method overriding (aka virutal methods) remains impossible. I believe many Python/C++ developers won't pick Go due to its lack of OOP and more andvanced language features. Maybe as a scripting language or a languagee to write little tools or concurrent stuff. I think just being a modernized C is not enough. Even in systems programming people look for more advanced language constructs as in C++ or D. If it's about performance alone, you would just stick to C. Currently Go can compete in performance just with Java. To define a business case in spite of the simplicity of the language IMHO speed would have been to be quite better as in Java. Besides that thread multiplexing as in Go would also make a lot of sense in D. It already exists for Java (see http://hawtdispatch.fusesource.org/, https://github.com/lmax-exchange/disruptor). Maybe porting HawtDispatch to D can be done without having the approach in hatDispatch). -- Oliver
Jun 23 2013