Code Monkey home page Code Monkey logo

Comments (4)

jfecher avatar jfecher commented on August 19, 2024

That will not work, if you are interested in something like virtual functions there are plans to include them, but I haven't decided on syntax or anything on them yet.

Going back to your example though, it would be possible for the compiler to say expand foo ch to

match ch with
| c8 c -> foo c
| c32 c -> foo c

Which would probably be a tad slower than virtual functions but you wouldn't have to store the function in the datatype. This would honestly be low on my list of priorities for the 1.0 release as you could just write a macro function to do the same thing:

![macro]
fun union_call: ('t->'u) fn, 't arg
    let argty = typeof arg
    if not isUnionTy argty then
        compErr "Argument to union_call macro must be a union type!" (callsite())

    var baseStr = "match ${Node arg} with\n"

    //this loop should always run at least twice because all unions have >= 2 members
    for ty in getUnionMemberTys argty do
        baseStr ++= "| ${Node ty} u -> ${Node fn} ${Node arg}\n"

    callsite().insert <| parse baseStr

then just call it with union_call foo ch and it even does error checking

from ante.

PavelVozenilek avatar PavelVozenilek commented on August 19, 2024

Such feature would probably have different implementation than ordinary vtable, it may be more like Smalltalk does it.

Anyway, I understood the macro example, really good one.


Will it be possible to invoke a macro without explicitly using its name (the union_call here), e.g. to hijack some existing function? For example to wrap some function(s) with mutex, w/o touching the source or how they are used in an application?

from ante.

jfecher avatar jfecher commented on August 19, 2024

To do that you would probably have to add that macro function as an event listener for a function/variable not found event

Ante.events.onFnNotFound ++= 
    fun f args =
        if len args < 1 then return ()

        if isUnion (args#0) then
            union_call f args

//or
![onEvent FnNotFound]
fun f args =
    if len args < 1 then return ()

    if isUnion (args#0) then
        union_call f args

from ante.

PavelVozenilek avatar PavelVozenilek commented on August 19, 2024

Ouch, this is still over my head.

It would be very handy to replace certain existing functions, even better if only inside specific scope. E.g. inside unit tests, instead of tricks or design changes to support mocking.

from ante.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.