18 comments

[ 3.8 ms ] story [ 49.9 ms ] thread
I can't decide if this is brilliant or terrifying.
Fairly mundane. You could do most of it in C89 with cpp.
This is why D doesn't have AST macros, a preprocessor, and makes operator overloading difficult for any purpose other than arithmetic.

Programmers can (and do) still create DSLs in D by using string mixins and CTFE.

Wasn't the original Bourne shell also written with (more basic) C preprocessor macros to imitate original ALGOL-style constructs?
Yes. It was the inspiration for the IOCCC (International Obfuscated C Code Competition).

http://www.ioccc.org/faq.html

But the macros were the least of its problems: It allocated memory by trapping SIGSEGV (SIGnal for SEGmentiation Violation; that is, the signal the OS sends a program when it's tried to access memory beyond the region it owns); the function which caught SIGSEGV allocated more RAM. This made it difficult to port sh to the Motorola 68000-based computers which were the first generation of Unix workstations.

http://www.in-ulm.de/~mascheck/bourne/segv.html

https://news.ycombinator.com/item?id=8843951

If you #define END as "return(0);}" and put "int main(){" at the bottom of basic.hpp, you can have a complete BASIC program with #include "basic.hpp" at the top as the only indication that it's C++.

    #include "basic.hpp"
    _10: LET X = 1;
    // ...
    _150: END
I think multiple data types could also be added in a way that mostly fits with BASIC syntax. GW-BASIC uses sigil suffixes on variable names to denote their type:[1]

    $  String variable
    %  Integer variable
    !  Single-precision variable (default)
    #  Double-precision variable
Something like this might be possible with unions (e.g. _10: LET X.D = 3.14; _20: LET N.I = 42;), or you can tolerate a few different LET macros (LETS, LETI, LETD).

[1] http://www.antonis.de/qbebooks/gwbasman/chapter%206.html

    ] 10 PRINT "HELLO'

    ] RUN

    ERROR
    In file included from dummy.cpp:1:
    In file included from /usr/include/c++/v1/vector:243:
    In file included from /usr/include/c++/v1/__bit_reference:15:
    In file included from /usr/include/c++/v1/algorithm:594:
    /usr/include/c++/v1/memory:1425:36: error: calling a private constructor of class 'std::__1::unique_ptr<int,
    std::__1::default_delete<int> >'
    ::new ((void*)__p) _Tp(_STD::forward<_Args>(__args)...);
    ^
    /usr/include/c++/v1/memory:1358:14: note: in instantiation of function template specialization
    'std::__1::allocator_traits<std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > >
    >::__construct<std::__1::unique_ptr<int, std::__1::default_delete<int> >, std::__1::unique_ptr<int,
    std::__1::default_delete<int> > &>' requested here
    {__construct(__has_construct<allocator_type, pointer, _Args...>(),
    ^
    /usr/include/c++/v1/vector:781:25: note: in instantiation of function template specialization
    'std::__1::allocator_traits<std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > >
    >::construct<std::__1::unique_ptr<int, std::__1::default_delete<int> >, std::__1::unique_ptr<int,
    std::__1::default_delete<int> > &>' requested here
    __alloc_traits::construct(__a, _STD::__to_raw_pointer(this->__end_), *__first);
    ^
    /usr/include/c++/v1/vector:924:9: note: in instantiation of function template specialization
    'std::__1::vector<std::__1::unique_ptr<int, std::__1::default_delete<int> >,
    std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > >
    >::__construct_at_end<std::__1::unique_ptr<int, std::__1::default_delete<int> > *>' requested here
    __construct_at_end(__x.__begin_, __x.__end_);
    ^
    dummy.cpp:7:37: note: in instantiation of member function 'std::__1::vector<std::__1::unique_ptr<int,
    std::__1::default_delete<int> >, std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > >
    >::vector' requested here
    std::vector<unique_ptr<int>> bar = foo;
    ^
    /usr/include/c++/v1/memory:1997:5: note: declared private here
    unique_ptr(const unique_ptr&);
    ^
    1 error generated.
templates are a inappropriate macro language. Everyone knows this except the C++ aficionados.
I'm still liking Visual BASIC 6.0 before the Dotnet era.

A shame that newer versions of Windows have problems installing it.

There is Jabaco that takes VB 6.0 syntax and compiles it to Java bytecode: http://www.jabaco.org/

It doesn't have ADO database support so I can't write apps with Databases in VB 6.0 and port them to Jabaco.

This trying to make C++ do BASIC commands is hard, might as well use this instead: http://robhagemans.github.io/pcbasic/

You can find the Classic BASIC games here: http://www.vintage-basic.net/games.html

They should work with PC-BASIC.

I remember of "on error resume next".

I also made ActiveX. It was a very good IDE.

If you'd like to fool around with an Applesoft BASIC compatible interpreter that comes with almost 1000 listings, check out DiscoRunner http://discorunner.com
IIRC, Common Lisp has something like this:

    (tagbody
        10 (print "Hello")
        20 (go 10))