Thank you very much for your reply, i learned a lot

My initial intention when asking the prior question was to define a function where some evaluations would return itself, while other evaluations would not. Such as

```
def f(x):
    if x%2==0:
        return hold(f(x))
    else:
        return x^2+1
```

In fact, I am trying to define the total differential in the following way, this is my final intention.

```
def Dt(expression1):
    if len(expression1.args()) == 1 \
    and expression1.args()[0]==expression1:
        # if the expression has only one variable
        # and that variable is the entire expression
        print("a")
        with hold:
            held = Dt(SR(expression1))
        return held
    else:
        return sum(map(lambda arg:diff(expression1,arg)*Dt(arg),expression1.args()))
```

How can I define this as a symbolic function? Perhaps multiple dispatch?

On 25/08/2024 23:33, Nils Bruin wrote:
Dear erentar,

There are two types of objects involved here: "symbolic functions" that live as objects in SR and "python functions" which are part of python itself. "hold" is only a directive that applies to symbolic expressions, whereas "def" defines a python function. Hence, the "hold" directive never applies.

Looking into what you are trying to compute, it would seem you want to replace g(x) by g(SR(x)). Replacing that another time would get you g(SR(SR(x))). However, no matter what x is, if SR(x) succeeds properly, then y=SR(x) will be an element of the symbolic ring and applying SR to an element of the symbolic ring should return exactly the same thing, so SR(y=SR(SR(x))=SR(x).

But then g(SR(SR(SR(x))))=g(SR(x)) and g(SR(SR(SR(SR(x)))))=g(SR(x)) . So by the properties of the system, applying SR repeatedly is not going to make a difference.

Is it that you want to define a symbolic function `g` *and* a convenience python function that forces the argument into SR? I don't think you need that, since symbolic functions will try to put their argument into SR when called (because SR arguments are the only thing they can work on. Hence, if I'm right in guessing what you want, the following would already do the job:

sage: g = function('g')  ## on top-level you could also just use `function('g')` for convenience
sage: a=10
sage: parent(a) #a is not an object in SR
Integer Ring
sage: E = g(a); E
g(10)
sage: E.operands()[0]
10
sage: parent(E.operands()[0]) #but the argument in the expression E is
Symbolic Ring

Note that g is not a python function:
sage: type(g)
<class 'sage.symbolic.function_factory.function_factory.<locals>.NewSymbolicFunction'>

(quite a mouth-full, but notably different from the type of an object that results from a "def" statement)






On Sunday 25 August 2024 at 13:17:16 UTC-7 erentar wrote:

    Greetings,

    I am trying to return a function call from the function itself
    with the
    context `hold`

    The following example does not behave as i'd want:

    ```
    def g(x):
        with hold:
            held = sqrt(x)
        return held

    g(4)
    > 2
    ```

    To get around this, i make the change SR(x):

    ```
    def g(x):
        with hold:
            held = sqrt(SR(x))
        return held

    g(4)
    > sqrt(4)
    ```

    This is what i want.

    Now, i want to return the function call `g(4)` rather than `sqrt(4)`.
    This is what i've tried:

    ```
    def g(x):
        with hold:
            held = g(SR(x))
        return held
    ```

    Sadly it reaches recursion limit and exits, which means it does
    not hold
    the function call.

    How can i return the function call from the function itself?

--
You received this message because you are subscribed to the Google Groups "sage-support" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-support+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sage-support/4695021e-be4f-4eb8-a929-1097e7271dban%40googlegroups.com <https://groups.google.com/d/msgid/sage-support/4695021e-be4f-4eb8-a929-1097e7271dban%40googlegroups.com?utm_medium=email&utm_source=footer>.

--
You received this message because you are subscribed to the Google Groups 
"sage-support" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-support+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sage-support/5b37bfea-09d6-4c8f-9a52-b82ff77d8707%40gmail.com.

Reply via email to