Pattern to match only “children” of certain elements

后端 未结 4 2056
隐瞒了意图╮
隐瞒了意图╮ 2020-12-09 21:44

I would like to be able to have a pattern that matches only expressions that are (alternately: are not) children of certain other elements.

For example, a pattern to

4条回答
  •  南笙
    南笙 (楼主)
    2020-12-09 22:38

    You might write a recursive function that descends an expression tree and acts on the types of expression you want only if inside the right type of sub-expression, while leaving everything else alone. Patterns would be used heavily in the definition of the function.

    Consider, for example, the following expression.

    test = {{1, 2}, Graphics[{
      Point[{{-1, 0}, {1, 0}}],
      Line[{{-1, 0}, {1, 0}}]},
     Frame -> True, 
     PlotRange -> {{-1, 1}, {-0.5, 0.5}}]};
    

    Let's suppose that we want to rotate every ordered pair that we see in the first argument of Graphics about the origin through the angle Pi/4, while leaving other points alone. The following function does this.

    Clear[f];
    f[{x_?NumericQ, y_?NumericQ}] := If[flag === True,
      RotationMatrix[Pi/4].{x, y}, {x, y}];
    f[Graphics[primitives_, rest___]] := Block[{flag = True},
      Graphics[f[primitives], rest]];
    f[x_?AtomQ] := x;
    f[x_] := f /@ x;
    

    Now we check

    f[test]
    

提交回复
热议问题