Why the first argument of makeScope is a function instead of a attrset?

I found some newScope are defined like extra: callPackageWith (someScope // extra).

I think makeScope is make a attrset working with callPackage. A callPackage is usually by callPackageWith, so why not using a attrset and defining newScope in makeScope? That can let us ignore how to define a newScope.